xslt匹配多个元素,但包含cdata

时间:2013-11-14 04:44:47

标签: wordpress xslt cdata

我试图编写一个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包装器的组合让我陷入困境。感谢

2 个答案:

答案 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行,则应按预期工作。