gpt4 book ai didi

xml - XSLT xsl :for-each conditional selection

转载 作者:数据小太阳 更新时间:2023-10-29 01:49:23 25 4
gpt4 key购买 nike

我有一段看起来像这样的 xml:

<root>
<tag1>tractor</tag1>
<tag2>
<subtag1 att="apple" />
<subtag2>
<subsubtag1>red</subsubtag1>
<subsubtag2>lunch</subsubtag2>
</subtag2>
</tag2>
<tag1>forklift</tag1>
<tag2>
<subtag1 att="pear" />
<subtag2>
<subsubtag1>green</subsubtag1>
<subsubtag2>breakfast</subsubtag2>
</subtag2>
</tag2>
<tag2>
<subtag1 att="apple" />
<subtag2>
<subsubtag1>green</subsubtag1>
<subsubtag2>dinner</subsubtag2>
</subtag2>
</tag2>
<tag1>combine harvester</tag1>
</root>

我需要对其进行转换,以便从每个 tag2 节点获取子标签 2 和 3,但只有 subtag1 为 apple 的 tag2 节点。我还需要每个序列号。

我当前的代码看起来像这样:

<xsl:for-each select="//tag2">
<apple>
<seq_num><xsl:value-of select="position()" /></seq_num>
<colour><xsl:value_of select="subtag2" /></colour>
<meal><xsl:value_of select="subtag3" /></meal>
</apple>
</xsl:for-each>

这很好,除了我需要 for-each 只返回 tag2,它是苹果(即 subtag1 = apple)。我不能使用 xsl:if 或 xsl:when,因为这样第二个苹果的序列号就会不准确。

有什么想法吗?

谢谢,瑞克

最佳答案

为了保留您的代码,应该尽可能简单:

<xsl:for-each select="//tag2[subtag1/@att='apple']">
<apple>
<seq_num><xsl:value-of select="position()" /></seq_num>
<colour><xsl:value-of select="subtag2/subsubtag1" /></colour>
<meal><xsl:value-of select="subtag2/subsubtag2" /></meal>
</apple>
</xsl:for-each>

根据下面的评论,建议最好避免使用//。在正确的上下文中,您应该能够。例如:

<xsl:stylesheet   version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/root">
<xsl:for-each select="tag2[subtag1/@att='apple']">
<apple>
<seq_num><xsl:value-of select="position()" /></seq_num>
<colour><xsl:value-of select="subtag2/subsubtag1" /></colour>
<meal><xsl:value-of select="subtag2/subsubtag2" /></meal>
</apple>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

应用于您的输入,产生相同的结果。或者更好的是,避免使用 xsl:for-each:

<xsl:stylesheet   version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/root">
<xsl:apply-templates select="tag2[subtag1/@att='apple']"/>
</xsl:template>

<xsl:template match="tag2">
<apple>
<seq_num><xsl:value-of select="position()" /></seq_num>
<colour><xsl:value-of select="subtag2/subsubtag1" /></colour>
<meal><xsl:value-of select="subtag2/subsubtag2" /></meal>
</apple>
</xsl:template>

</xsl:stylesheet>

关于xml - XSLT xsl :for-each conditional selection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6359159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com