이와 같은 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>
이에 접근하는 더 좋은 방법이 있는지 알려주십시오. 고마워
여기에는 매개 변수가있는 명명 된 템플릿이 필요하지 않습니다. 대신 일치하는 템플릿이있는 경우 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
요소가 항상 data
XML 의 첫 번째 요소 이면이 를 단순화 할 수 있습니다.
또한 속성 값 템플릿 을 사용하여 Category
요소에 속성을 생성 하여 XSLT를 크게 단순화합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다