我知道XSLT不允许直接打破xsl:for-each
循环,但必须有一种简单的方法来添加更多条件来实现它。我在相同的背景下看到很多在线但无法继续进行。
我想迭代一组XML标记,并在迭代中找到一个XML标记中的值,并在另一个xsl:template
中使用该值。例如,
<xsl:template name="categoryCheckTemplate">
<xsl:for-each select="TEST/ABC/DEF/GHI/Row">
<xsl:variable name="category">
<xsl:choose>
<xsl:when test="JKL/Category">
<xsl:value-of select="JKL/Category"/>
</xsl:when>
<xsl:when test="MNO/Category">
<xsl:value-of select="MNO/Category"/>
</xsl:when>
</xsl:choose>
</xsl:variable>
<xsl:choose>
<xsl:when test="(contains($category,'123'))">
<xsl:value-of select="'true'"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'false'"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
我想在另一个模板中使用此模板的'true'
值,但不想一直迭代它。任何时候它都是真的,我需要走出迭代。
XML输入
<xml>
<TEST>
<ABC>
<DEF>
<GHI>
<Row>
<JKL>
<Category>123</Category>
</JKL>
</Row>
<Row>
<JKL>
<Category>456</Category>
</JKL>
</Row>
<Row>
<JKL>
<Category>789</Category>
</JKL>
</Row>
<Row>
<JKL>
<Category>012</Category>
</JKL>
</Row>
</GHI>
</DEF>
</ABC>
</TEST>
</xml>
所需输出
<item>
<cat>123</cat>
</item>
任何人都可以帮助这个XSLT 1.0吗?
答案 0 :(得分:3)
你在程序上思考太多。你不需要打破;你甚至不需要循环。
您的整个过程可以并且可以简化为单个XPath表达式:
string(contains(TEST/ABC/DEF/GHI/Row/*[self::JKL or self::MNO]/Category, '123'))
那就是它。没有循环。没有休息。只需测试输入XML和可选的字符串转换(在实际上下文中可能需要也可能不需要)。
OP添加输入XML和所需输出XML后的这个XSLT,
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<item>
<xsl:if test="/xml/TEST/ABC/DEF/GHI/Row/
*[self::JKL or self::MNO]/Category = 123">
<cat>123</cat>
</xsl:if>
</item>
</xsl:template>
</xsl:stylesheet>
将生成请求的输出XML,
<item>
<cat>123</cat>
</item>
如果原始程序指定的条件为真 1 ,或者此输出XML,
<item/>
否则。
1 我冒昧地从字符串包含测试切换到字符串值相等测试,这更可能是这里所希望的(否则&#34; 1234&#34;等也满足测试。