3

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

4

2 回答 2

2

//item[category/.='Featured']甚至在语法上都不是有效的 XPath,我认为这是一个错字。

无论如何,这与 CDATA 无关。CDATA 没有意义,它不存在。它仅在解析文档期间很重要。当您在输入上使用 XPath 时,它已经消失了。

在进行字符串比较之前,您需要修剪空格。尝试:

<xsl:apply-templates select="//item[category[normalize-space() = 'Featured']]" />
于 2013-11-14T05:08:17.430 回答
1

正如 Tomalak 指出的那样,您拥有的 XPath 无效,甚至可能导致运行XSLT 的问题。Tomalaks 可能是您正在寻找的答案,但如果您不确定特色是否可能在其中,但不是唯一的文本,您也可以使用contains()XPath 函数,如下所示:

<xsl:apply-templates select="//item[category[contains(text(),'Featured')]]"/>

如果您更改apply-templatesXSLT 中的行,这应该可以按预期工作。

于 2013-11-14T05:10:47.217 回答