[英]Reaching the child node in different order from parent nodes in XSLT
我一直在嘗試解決XSLT中的一個問題,該問題到達特定父節點的子節點,而不管該父節點中的順序如何。
假設我們有一個xml文件:
<book>
<id>
<type>
<name name="something">
--SomeText
</name>
</type>
<id>
</book>
<book>
<name name="something">
<name>
<id>
--SomeNodes--
</id>
<number>
</number>
</book>
這里的想法是,我有許多這樣的節點集,並且每個節點集都有不同的<name>
節點順序。
我想要的是,無論順序如何,每次與book節點匹配時,我都應該能夠獲取<name>
節點的值。
XSLT:
<xsl:template match="book">
<xsl:param name="rule" select="//name[1]>
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
<xsl:if test=name/@name>
<xsl:comment><xsl:value-of select="concat('some text', substring($rule,2,4))"/>
</xsl:if>
</xsl:template>
因此,顯然通過這種方法,由於“ //”,我得到了node的所有結果。
如果我將其更改為不帶“ //”的名稱[1],則它僅在書后找到名字元素,而在其他地方找不到。
每次與相同且完全相同的節點值匹配並在模板后將其值寫為注釋時如何遞歸獲取。
注意:我給您的示例為XML,但我正在從XSLT-XSLT轉換。
我認為,當您像這樣對不整潔的數據進行任何類型的轉換時,最好將其作為2遍處理進行:首先整理數據,然后將其轉換為所需的形式。 這樣,整理數據的過程便是可重用和獨立的。
您只給出了輸入格式的草圖,但我將從轉換書本元素開始,因此名稱始終是頂級子級:
<xsl:template match="book">
<xsl:copy>
<name><xsl:value-of select=".//name"/></name>
etc.
</xsl:copy>
</xsl:template>
整理數據后,下一步將變得非常簡單。
您可以嘗試將其與<name>
匹配,而不是將模板與<book>
匹配。
<xsl:template match="name">
<book>
<xsl:copy>
<xsl:apply-templates select="@name" />
</xsl:copy>
</book>
</xsl:template>
產量
<book>
<name>something</name>
</book>
<book>
<name>something</name>
</book>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.