키 일치를 사용하여 XSLT 템플릿 재귀 호출

금연 건강 증진 협회

이와 같은 XML이 있습니다.

<categories>
    <data>
        <category_id>216</category_id>
        <children_sort_order>217</children_sort_order>
        <children_sort_order>324</children_sort_order>
        <children_sort_order>395</children_sort_order>
        <children_sort_order>580</children_sort_order>
        <children_sort_order>506</children_sort_order>
        <children_sort_order>466</children_sort_order>
        <children_sort_order>626</children_sort_order>
        <children_sort_order>532</children_sort_order>
        <depth>0</depth>
        <description/>
        <name>Products</name>
        <path>products</path>
        <slug>products</slug>
        <state>live</state>
        <status>
            <state>live</state>
        </status>
        <updated_at>2016-06-09T05:13:08Z</updated_at>
        <westfield_locale>en_AU</westfield_locale>
        <sort_order>0</sort_order>
    </data>
    <data>
        <category_id>217</category_id>
        <children_sort_order>218</children_sort_order>
        <children_sort_order>319</children_sort_order>
        <children_sort_order>232</children_sort_order>
        <children_sort_order>237</children_sort_order>
        <children_sort_order>244</children_sort_order>
        <children_sort_order>255</children_sort_order>
        <children_sort_order>225</children_sort_order>
        <children_sort_order>307</children_sort_order>
        <children_sort_order>286</children_sort_order>
        <children_sort_order>262</children_sort_order>
        <children_sort_order>269</children_sort_order>
        <children_sort_order>279</children_sort_order>
        <children_sort_order>251</children_sort_order>
        <children_sort_order>299</children_sort_order>
        <children_sort_order>292</children_sort_order>
        <depth>1</depth>
        <description/>
    <name>Women's</name>
        <path>products/womens-fashion-accessories</path>
        <slug>womens-fashion-accessories</slug>
        <state>live</state>
        <status>
            <state>live</state>
        </status>
        <updated_at>2016-07-12T03:35:17Z</updated_at>
        <westfield_locale>en_AU</westfield_locale>
        <sort_order>0</sort_order>
    </data>
    <errors />
    <meta>
        <api_version>1.3</api_version>
        <deprecation_information />
    </meta>
</categories>

최상위 요소를 읽고 부모 xml 요소를 생성 한 다음 관련 범주를 읽고 첫 번째 요소에 자식으로 삽입하고 싶습니다. 따라서 출력은 다음과 같아야합니다.

<Category category_id="216" name="Products" parent="0">
  <Category category_id="217" name="Women's" parent="216">
  </Category>
</Category> 

키 일치를 사용하여 재귀 템플릿을 적용하려고했지만 작동하지 않았습니다.

<xsl:key name="children-search" match="data" use="category_id"/>
    <xsl:template name="Category">
            <xsl:param name="parent"/>

            <xsl:variable name="current" select="category_id"/>

            <xsl:element name="Category">
                <xsl:attribute name="id"><xsl:value-of select="category_id"/></xsl:attribute>
                <xsl:attribute name="code">1</xsl:attribute><!--<xsl:value-of select="sort_order"/></xsl:attribute>--><!-- Field is no longer provided in the Westfield Category Data -->
                <xsl:attribute name="name"><xsl:value-of select="slug"/></xsl:attribute>
                <xsl:attribute name="displayname"><xsl:value-of select="name"/></xsl:attribute>
                <xsl:attribute name="desc"><xsl:value-of select="description"/></xsl:attribute>
                <xsl:attribute name="ismappable">1</xsl:attribute> <!-- Field is no longer provided in the Westfield Category Data -->
                <xsl:attribute name="order"><xsl:value-of select="sort_order"/></xsl:attribute>
                <xsl:attribute name="active"><xsl:choose><xsl:when test="state = 'live'">1</xsl:when><xsl:otherwise>0</xsl:otherwise></xsl:choose></xsl:attribute>
                <xsl:attribute name="parent"><xsl:value-of select="$parent"/></xsl:attribute>
            </xsl:element>

            <!-- recursive call -->
            <xsl:for-each select="children_sort_order">
                <xsl:call-template name="Category"><xsl:with-param name="parent" select="key('children-search', $current)"/></xsl:call-template>
            </xsl:for-each>
        </xsl:template> 

이에 접근하는 더 좋은 방법이 있는지 알려주십시오. 고마워

팀 C

여기에는 매개 변수가있는 명명 된 템플릿이 필요하지 않습니다. 대신 일치하는 템플릿이있는 경우 data다음과 같이 하위 요소를 가져올 수 있습니다.

<xsl:for-each select="children_sort_ordesr">
   <xsl:apply-templates select="key('children-search', .)" />
</xsl:for-each>

아니면 (마틴 호넨에게 감사합니다!) 이거 ..

 <xsl:apply-templates select="key('children-search', children_sort_order)" />

이 XSLT 시도

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:key name="children-search" match="data" use="category_id"/>
<xsl:key name="parent_search" match="children_sort_order" use="."/>

 <xsl:template match="categories">
    <xsl:copy>
       <xsl:apply-templates select="data[not(key('parent_search', category_id))]" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="data">
     <Category id="{category_id}" name="{name}">
       <!-- recursive call -->
       <xsl:apply-templates select="key('children-search', children_sort_order)" />
     </Category>
   </xsl:template>
</xsl:stylesheet>

단순히 최상위 data요소 (즉, data상위 요소가없는 요소) 를 선택하는 데 사용되는 "parent_search"키의 사용에 유의하십시오 . <xsl:apply-templates select="data[1]" />최상위 data요소가 항상 dataXML 의 첫 번째 요소 이면이 를 단순화 할 수 있습니다.

또한 속성 값 템플릿 을 사용하여 Category요소에 속성을 생성 하여 XSLT를 크게 단순화합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Clang AST 매처를 사용하여 C ++ 템플릿 함수 호출을 어떻게 일치 시키나요?

분류에서Dev

템플릿을로드하기위한 재귀 호출을 사용하여 ajax 데이터를 ng-include에 바인딩

분류에서Dev

XSLT 키 값 및 적용 템플릿

분류에서Dev

재귀 적으로 상속 된 템플릿 기본 클래스의 템플릿 메서드를 호출하는 방법

분류에서Dev

NEST를 사용하여 Elasticsearch 템플릿 쿼리 호출?

분류에서Dev

재귀 적 "사용"/ 추출 템플릿 매개 변수를 구현하는 방법

분류에서Dev

재귀 적 xslt 템플릿 방지

분류에서Dev

XSLT를 사용한 재귀

분류에서Dev

재귀를 사용하여 키 추가

분류에서Dev

여러 재귀 호출을 사용하여 일반 재귀를 꼬리 재귀로 변환

분류에서Dev

SFINAE를 템플릿 인수로 사용하는 컴파일 시간 재귀

분류에서Dev

XSLT-템플릿 일치를 사용하여 조건부로 요소를 그룹화하는 방법

분류에서Dev

xslt의 재귀 호출

분류에서Dev

XML 값을 기반으로하는 XSLT 적용 템플릿 또는 호출 템플릿

분류에서Dev

XSLT를 사용하여 요소를 일치시키고 HTML을 출력하는 방법은 무엇입니까?

분류에서Dev

ActionListener를 사용하여 재귀 트리 메서드 호출

분류에서Dev

TypeTag를 사용하여 재귀 적으로 함수 호출

분류에서Dev

템플릿 유형 목록을 반복하는 동안 재귀를 멈출 수 없습니다.

분류에서Dev

템플릿 템플릿 클래스, 존재하는 경우 함수 호출

분류에서Dev

템플릿 어플라이언스가있는 XSLT 재귀 패스 스루 출력

분류에서Dev

템플릿 내에서 XSLT 키를 사용할 수 없음 (노트 세트 배열 사용)

분류에서Dev

재귀 템플릿 함수의 첫 번째 호출에서 함수를 실행하는 방법은 무엇입니까?

분류에서Dev

참조로 XSLT 템플릿 호출

분류에서Dev

xslt의 다른 템플릿에서 템플릿을 호출하는 방법은 무엇입니까?

분류에서Dev

C # 코드를 사용하여 XSLT의 템플릿 이름 읽기

분류에서Dev

AWS : Batch / ECS를 사용하여 템플릿 디스크 탑재

분류에서Dev

교체 또는 교체하지 않음-xsl 1.0 결과의 재귀 호출 템플릿 또는 적용 템플릿 Tree Frag 성가심

분류에서Dev

Hogan / Mustache를 사용하는 영구 템플릿 (또는 템플릿 재사용)?

분류에서Dev

템플릿 일치 및 변수 이름을 사용하는 XSLT 혼동

Related 관련 기사

  1. 1

    Clang AST 매처를 사용하여 C ++ 템플릿 함수 호출을 어떻게 일치 시키나요?

  2. 2

    템플릿을로드하기위한 재귀 호출을 사용하여 ajax 데이터를 ng-include에 바인딩

  3. 3

    XSLT 키 값 및 적용 템플릿

  4. 4

    재귀 적으로 상속 된 템플릿 기본 클래스의 템플릿 메서드를 호출하는 방법

  5. 5

    NEST를 사용하여 Elasticsearch 템플릿 쿼리 호출?

  6. 6

    재귀 적 "사용"/ 추출 템플릿 매개 변수를 구현하는 방법

  7. 7

    재귀 적 xslt 템플릿 방지

  8. 8

    XSLT를 사용한 재귀

  9. 9

    재귀를 사용하여 키 추가

  10. 10

    여러 재귀 호출을 사용하여 일반 재귀를 꼬리 재귀로 변환

  11. 11

    SFINAE를 템플릿 인수로 사용하는 컴파일 시간 재귀

  12. 12

    XSLT-템플릿 일치를 사용하여 조건부로 요소를 그룹화하는 방법

  13. 13

    xslt의 재귀 호출

  14. 14

    XML 값을 기반으로하는 XSLT 적용 템플릿 또는 호출 템플릿

  15. 15

    XSLT를 사용하여 요소를 일치시키고 HTML을 출력하는 방법은 무엇입니까?

  16. 16

    ActionListener를 사용하여 재귀 트리 메서드 호출

  17. 17

    TypeTag를 사용하여 재귀 적으로 함수 호출

  18. 18

    템플릿 유형 목록을 반복하는 동안 재귀를 멈출 수 없습니다.

  19. 19

    템플릿 템플릿 클래스, 존재하는 경우 함수 호출

  20. 20

    템플릿 어플라이언스가있는 XSLT 재귀 패스 스루 출력

  21. 21

    템플릿 내에서 XSLT 키를 사용할 수 없음 (노트 세트 배열 사용)

  22. 22

    재귀 템플릿 함수의 첫 번째 호출에서 함수를 실행하는 방법은 무엇입니까?

  23. 23

    참조로 XSLT 템플릿 호출

  24. 24

    xslt의 다른 템플릿에서 템플릿을 호출하는 방법은 무엇입니까?

  25. 25

    C # 코드를 사용하여 XSLT의 템플릿 이름 읽기

  26. 26

    AWS : Batch / ECS를 사용하여 템플릿 디스크 탑재

  27. 27

    교체 또는 교체하지 않음-xsl 1.0 결과의 재귀 호출 템플릿 또는 적용 템플릿 Tree Frag 성가심

  28. 28

    Hogan / Mustache를 사용하는 영구 템플릿 (또는 템플릿 재사용)?

  29. 29

    템플릿 일치 및 변수 이름을 사용하는 XSLT 혼동

뜨겁다태그

보관