我试图编写一个XSLT,它会选择类别为“精选”的项目,因为类别中的数据包含在CDATA中。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Matched Items</h2>
<xsl:apply-templates select="//item[category/.='Featured']"/>
</body>
</html>
</xsl:template>
<xsl:template match="item">
<div class="news-item" width="100%">
<div class="news-item-description">
<xsl:value-of select="description"/>
</div>
</div>
<div class="clear" />
</xsl:template>
</xsl:stylesheet>
以下是我的数据示例。这是来自wordpress博客,所以我无法改变输出。
<items>
<item>
<category>
<![CDATA[ Category A ]]>
</category>
<category>
<![CDATA[ Featured ]]>
</category>
<description>This item should be in the output HTML</description>
</item>
<item>
<category>
<![CDATA[ Uncategorized ]]>
</category>
<category>
<![CDATA[ Some other category ]]>
</category>
<description>This item should NOT be in the output HTML</description>
</item>
<item>
<category>
<![CDATA[ Uncategorized ]]>
</category>
<category>
<![CDATA[ Featured ]]>
</category>
<description>This item should be in the output HTML</description>
</item>
</items>
我想要的输出如下:
<html>
<body>
<h2>Matched Items</h2>
<div class="news-item" width="100%">
<div class="news-item-description">This item should be in the output HTML</div>
</div>
<div class="clear"></div>
<div class="news-item" width="100%">
<div class="news-item-description">This item should be in the output HTML</div>
</div>
<div class="clear"></div>
</body>
</html>
这似乎应该很容易。多个类别元素和CDATA包装器的组合让我陷入困境。感谢
答案 0 :(得分:2)
//item[category/.='Featured']
甚至不是语法上有效的XPath,我认为这是一个错字。
无论如何,这与CDATA无关。 CDATA没有意义,它不存在。它只在文档的解析期间很重要。当您在输入上使用XPath时,它已经消失了。
在进行字符串比较之前,您需要修剪空格。尝试:
<xsl:apply-templates select="//item[category[normalize-space() = 'Featured']]" />
答案 1 :(得分:1)
正如Tomalak所指出的那样,XPath无效,甚至可能导致问题正在运行 XSLT。 Tomalaks可能是您正在寻找的答案,但如果您不确定功能是否在中,而不是中的唯一文本,您也可以使用contains()
XPath功能,如:
<xsl:apply-templates select="//item[category[contains(text(),'Featured')]]"/>
如果更改XSLT中的apply-templates
行,则应按预期工作。