[英]XSLT How to select node attribute value with xsl:for-each and xsl:if
[英]How to break out of xsl:for-each loop in XSLT?
我知道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吗?
你在考虑过程太过程了。 你不需要打破; 你甚至不需要循环。
您的整个过程可以而且应该简化为单个XPath表达式:
string(contains(TEST/ABC/DEF/GHI/Row/*[self::JKL or self::MNO]/Category, '123'))
而已。 没有循环。 没有休息。 只需测试输入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我冒昧地从字符串包含测试切换到字符串值相等测试,这更可能是这里所希望的(否则“1234”等也会满足测试)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.