在XSLT的for-each循环中使用if排除指定文档的问题
解决XSLT过滤特定标题文档的问题
刚接触XSLT3天就能尝试写循环和条件判断已经很棒啦!咱们来一步步解决你的问题~
先说说你现有代码里的几个小问题:
- 你的
xsl:for-each路径写错了:/process/documents[1]/document[1]/只会选中第一个document节点,而且末尾的斜杠是多余的。要选中所有document节点,应该写成/process/documents/document - 条件判断里的路径完全不符合你的XML结构:原XML里
titel是直接作为document的子元素存在的,没有element和value节点,所以不需要写那么复杂的路径 - 在
for-each内部,当前节点就是document,所以直接用相对路径(比如titel)就可以,不用每次都写完整的绝对路径
正确的实现方式(两种可选)
方式一:用for-each + if(和你原来的思路最接近)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/"> <documents> <!-- 遍历所有document节点 --> <xsl:for-each select="/process/documents/document"> <!-- 判断当前document的titel不是"Doc1" --> <xsl:if test="titel != 'Doc1'"> <document filename="{titel}"/> </xsl:if> </xsl:for-each> </documents> </xsl:template> </xsl:stylesheet>
方式二:用模板匹配(更符合XSLT的设计思想)
如果想更贴合XSLT的“匹配优先”原则,可以用模板来实现,代码更简洁:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <!-- 匹配根节点,输出外层的documents元素 --> <xsl:template match="/"> <documents> <!-- 应用匹配document的模板 --> <xsl:apply-templates select="/process/documents/document"/> </documents> </xsl:template> <!-- 匹配titel不是"Doc1"的document节点,输出目标元素 --> <xsl:template match="document[titel != 'Doc1']"> <document filename="{titel}"/> </xsl:template> <!-- 匹配titel是"Doc1"的document节点,什么都不输出(过滤掉) --> <xsl:template match="document[titel = 'Doc1']"/> </xsl:stylesheet>
解释一下关键部分:
{titel}是属性值模板,可以直接把titel的内容作为属性值,比用xsl:attribute+xsl:value-of更简洁- 不管用哪种方式,核心都是选中所有document节点,然后过滤掉
titel等于"Doc1"的那个,剩下的输出成你需要的结构
这样处理后,不管你的XML里有多少个document,都会自动过滤掉标题为"Doc1"的文档,输出剩下的内容。
内容的提问来源于stack exchange,提问作者Toitula
相关产品推荐
相关产品推荐

