【问题标题】:xsl:strip-space is not removing the carriage returnxsl:strip-space 没有删除回车符
【发布时间】:2012-12-27 06:40:42
【问题描述】:

这是 xml 文件。 “CategoryName”元素中的空格和回车是有意的。

<?xml version="1.0" encoding="utf-8"?>
<group>
    <item>
        <id>item 1</id>
        <CategoryName>


        </CategoryName>
    </item>
    <item>
        <id>item 2</id>
        <CategoryName></CategoryName>
    </item>
    <item>
        <id>item 3</id>
        <CategoryName>      </CategoryName>
    </item>

</group>

以下是上述 XML 文件的 XSLT 文件。它应该做的是清除“CategoryName”元素中的所有空格。然后,它会测试“CategoryName”是否为空。

<?xml version="1.0" encoding="utf-8"?>
<!-- DWXMLSource="testempty.xml" -->

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>

  <xsl:strip-space elements="*" /> <!--HERE IS STRIP SPACE-->


  <xsl:template match="/">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Untitled Document</title>
    </head>

    <body>
    <xsl:for-each select="/group/item">
      <xsl:if test="CategoryName = ''"> <!--HERE IS THE TEST-->
        <p>Empty</p>          <!--IT WILL OUTPUT 'EMPTY' IF THE ELEMENT IS EMPTY-->
      </xsl:if>
    </xsl:for-each>
    </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

问题是,xsl:strip-space 没有做好它的工作。只有第 2 项的“CategoryName”通过了“空”测试。

怎么了?

【问题讨论】:

  • 我在我的 eclipse 上测试了这个,它按你预期的那样工作。它打印 3 "Empty"
  • 我用的是 Adob​​e Dreamweaver,它只显示一个 Empty。
  • 我之前读过这个问题,但它并没有解决我的问题。

标签: xml xslt


【解决方案1】:

我不知道 Dreamweaver 使用的是什么 XSLT 引擎,但这看起来不对。

我认为可能有一些 XSLT 处理器仅在向它们提供未解析的输入(词法 XML)时才应用 xsl:strip-space,而不是在向它们提供 DOM 时应用。规范中没有任何内容可以证明这种行为是正当的,但它使实现者的生活变得更加轻松。

值得指出的是,这不是 xsl:strip-space 的用途。它旨在用于去除“可忽略”的空白,即用于仅元素内容中的缩进的空白。如果您使用的是 XSLT 2.0 模式感知转换,这将成为正式的规则:xsl:strip-space 不会影响具有简单内容的元素的内容。这是因为去除此类元素的空格可能会使该元素对架构无效。

【讨论】:

  • 同意!空格或回车毕竟不为空!
  • 那么我该怎么做才能测试空元素呢?
  • 使用测试normalize-space(XX) != ''
【解决方案2】:

很明显,DeamWeaver 的 XSLT 处理器有一个错误。

这是获得所需结果的另一种方法:

替换

   <xsl:if test="CategoryName = ''">

   <xsl:if test="not(normalize-space(CategoryName))">

【讨论】:

  • @user1535147,不客气。我建议阅读一本关于 XPath 的好书——请参阅此答案以获得好的资源:@​​987654321@
猜你喜欢
  • 2010-11-11
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多