XSLT:从for-each / select中删除“”标签

时间:2018-05-29 16:44:28

标签: xslt xslt-2.0

我一直在尝试从select中删除只有 的标记。 这是XML的摘录

<?xml version="1.0" encoding="iso-8859-1"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<html>
<body><p class="text">
  <br /><b>Header 2</b>&nbsp;
</p>
<p class="text">
  Lorem ipsum.
</p>
<p class="text">
  More lorem ipsum.
</p>
<p class="text">
  &nbsp;
</p>
<p class="text">
  &nbsp;
</p>
<p class="text">
  &nbsp;
</p>
<p class="text">
  &nbsp;
</p>
<br />
<p class="text" align="center">Header 3</p>...
</body>
</html>

我的选择看起来像这样,它给了我两个标题之间的所有元素

  

// [local-name()='p'and following-sibling :: [local-name()='p'] / ='Header 3'及前一页-sibling :: [local-name()='p'] / * ='Header 2']

在这个for-each中,我只是为每个节点获取“text()”的值。 输出xml如下所示:

<mylabel>
  Lorem ipsum.
</mylabel><mylabel>
  More lorem ipsum.
</mylabel><mylabel>
   
</mylabel><mylabel>
   
</mylabel><mylabel>
   
</mylabel><mylabel>
   
</mylabel>

我试图在select中添加更多条件,例如not(string(text())),string-length(text())&gt; 1,text()!=''或normalize-space (。)!=''但似乎&nbsp;传递了所有这些。

有没有办法用&nbsp;删除(不选择)代码?

1 个答案:

答案 0 :(得分:1)

这一切都取决于您的实体nbsp已定义,假设它被定义为&#160;您可以选​​择p元素,而不是完全混合使用空格和非破坏性空格字符p[not(matches(., '^[\s&#160;]*$'))]

https://xsltfiddle.liberty-development.net/94hvTz6,您可以看到建议的谓词排除仅包含空格的p元素和不间断的空间实体引用,示例只是

  <xsl:template match="/">
      <xsl:copy-of select="//p[not(matches(., '^[\s&#160;]*$'))]"/>
  </xsl:template>

您的样本数据,结果是

<p class="text">
  <br/><b>Header 2</b> 
</p><p class="text">
  Lorem ipsum.
</p><p class="text">
  More lorem ipsum.
</p><p class="text" align="center">Header 3</p>

如果检查https://xsltfiddle.liberty-development.net/94hvTz6/2,那么您可以看到XPath选择或排除适用于您编辑的样本和声明的实体,显然如果您包含完整的XHTML DTD,它将元素放入XHTML命名空间然后XSLT需要调整以使用

考虑命名空间
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xpath-default-namespace="http://www.w3.org/1999/xhtml"
    version="3.0">

    <xsl:template match="/">
        <xsl:copy-of select="//p[not(matches(., '^[\s&#160;]*$'))]"/>
    </xsl:template>

</xsl:stylesheet>

或者,如评论中所述,使用*:p

xsltfiddle不能与XML和DTD一起使用,因此您无法在那里检查它,但是在oXygen内部或从命令行使用Saxon时,建议应该有效。