Getting rid of empty lines after deleting nodes us

2019-04-03 13:48发布

I am using XSLT to make a very simple transformation in a XML document. I just want to delete all the element nodes with a particular name. It happens that in my source document all these nodes are located at the end of the document, but after the transformation, although the nodes have disappeared as I intended, there are lots of empty lines in their place.

This is strictly a cosmetic issue since I accomplished what I wanted with the transformation, but out of curiosity: how can I get rid of these empty lines ? This is the XSL file I used for the transformation (the element I wanted to remove is named "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>

标签: xml xslt
1条回答
时光不老,我们不散
2楼-- · 2019-04-03 14:26

The reason is in the white-space-only text nodes that are immediate siblings to the deleted elements.

Solution: Simply add this XSLT instruction to remove any white-space-only text nodes -- even before the transformation is started:

 <xsl:strip-space elements="*"/>

The result may lose indentation -- if so, add this:

 <xsl:output omit-xml-declaration="yes" indent="yes"/>

The complete transformation becomes:

<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>

when applied on this XML document (none provided!):

<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>

The wanted, correct result (no trailing white-space) is produced:

<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>
查看更多
登录 后发表回答