使用XSLT删除节点后删除空行

Ser*_*gio 19 xml xslt

我正在使用XSLT在XML文档中进行非常简单的转换.我只想删除具有特定名称的所有元素节点.碰巧在我的源文档中,所有这些节点都位于文档的末尾,但是在转换之后,虽然节点已经按照我的意图消失了,但是它们的位置有很多空行.

这完全是一个美容问题,因为我完成了我想要的改造,但出于好奇:我怎么能摆脱这些空行呢?这是我用于转换的XSL文件(我要删除的元素名为"relations"):

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" />

  <xsl:template match="*">
    <xsl:copy>
      <xsl:copy-of select="@*" />
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="relation"/>

</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

Dim*_*hev 28

原因在于仅限空格的文本节点是已删除元素的直接兄弟节点.

解决方案:只需添加此XSLT指令即可删除任何仅限空格的文本节点 - 甚至在转换开始之前:

 <xsl:strip-space elements="*"/>
Run Code Online (Sandbox Code Playgroud)

结果可能会丢失缩进 - 如果是这样,请添加:

 <xsl:output omit-xml-declaration="yes" indent="yes"/>
Run Code Online (Sandbox Code Playgroud)

完整的转变成为:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

    <xsl:template match="*">
        <xsl:copy>
            <xsl:copy-of select="@*" />
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="relation"/>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

应用于此XML文档时(未提供!):

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>

  <relation/>
  <relation/>
  <relation/>
  <relation/>
  <relation/>
  <relation/>
  <relation/>
  <relation/>
</nums>
Run Code Online (Sandbox Code Playgroud)

产生了想要的正确结果(没有尾随空格):

<nums>
   <num>01</num>
   <num>02</num>
   <num>03</num>
   <num>04</num>
   <num>05</num>
   <num>06</num>
   <num>07</num>
   <num>08</num>
   <num>09</num>
   <num>10</num>
</nums>
Run Code Online (Sandbox Code Playgroud)

  • 我要补充的唯一警告是:在将xsl:strip-space添加到样式表之前,检查源文档是否包含重要的空白文本节点,即混合内容中的空格. (2认同)