-1

我有一个包含多行数据的 XML。

<abc>
 <def>some text1</def>
 <xyz>stack overflow</xyz>
</abc>
<abc>
 <def>some text2</def>
 <xyz>stack overflow 2)</xyz>
</abc>
<abc>
 <def>some text</def>
 <xyz>stack overflow 3)</xyz>
</abc>

现在我想在XSL 1.0中为此编写代码, 它将开始检查每一行,即元素中的值/文本“2)”是否仅存在。每当它在循环期间第一次遇到文本“2)”时,它应该打印“XSL_1.0 Programming”作为值并应该退出循环。

4

3 回答 3

2

您以错误的方式处理这个问题 - XSLT 不是一种过程语言,没有办法“退出循环”。相反,您需要考虑如何以更具声明性的方式识别您感兴趣的节点。例如 XPath 表达式

abc[contains(., '2)')]

标识abc在其后代文本节点中任何位置包含字符串“2)”的所有元素,因此

(abc[contains(., '2)')])[1]

将只提取第一个这样的元素,或者如果没有匹配的元素,则提取一个空节点集。如果你想处理abc元素直到并包括第一个包含“2)”的元素,但不是任何后续元素,你可以使用类似的东西

<xsl:for-each select="abc[not(preceding-sibling::abc[contains(., '2)')])]">
于 2013-02-05T11:53:31.453 回答
1

正如 Ian Roberts 所解释的,在 XSLT 中没有打破循环的概念。您必须提前决定要处理哪些节点,听起来您只对元素感兴趣,包括包含“2)”的第一个abc元素。

实际上,在这里使用xsl:apply-templates可能会更好。

<xsl:apply-templates select="abc[not(preceding-sibling::abc[contains(xyz, '2)')])]" />

因此,这将选择所有没有前面的 '2)' 元素的元素。

接下来,您可以根据xyz元素的内容添加模板以匹配abc元素。例如,要输出“XSL_1.0 Programming”,如果它有一个 '2)',请执行以下操作

<xsl:template match="abc[contains(xyz, '2)')]">
    <xsl:text>XSL_1.0 Programming</xsl:text>
</xsl:template>

这是完整的 XSLT

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

    <xsl:template match="/*">
        <xsl:apply-templates select="abc[not(preceding-sibling::abc[contains(xyz, '2)')])]" />
    </xsl:template>

    <xsl:template match="abc">
        <xsl:value-of select="concat(xyz, '&#10;')" />
    </xsl:template>

    <xsl:template match="abc[contains(xyz, '2)')]">
        <xsl:text>XSL_1.0 Programming&#10;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

应用于以下 XML 时(注意它有一个根元素)

<root>
<abc>
 <def>some text1</def>
 <xyz>stack overflow</xyz>
</abc>
<abc>
 <def>some text2</def>
 <xyz>stack overflow 2)</xyz>
</abc>
<abc>
 <def>some text3</def>
 <xyz>stack overflow</xyz>
</abc>
<abc>
 <def>some text</def>
 <xyz>stack overflow 3)</xyz>
</abc>
</root>

以下是输出

stack overflow
XSL_1.0 Programming
于 2013-02-05T13:10:37.000 回答
0

这个怎么样:

<xsl:if test="abc[contains(xyz, '2)')]"> 
   <xsl:text>XSL_1.0 Programming</xsl:text> 
</xsl:if>
于 2013-02-05T12:37:04.013 回答