如何删除除一个之外的空元素

时间:2014-06-24 19:39:53

标签: xml xslt

输入:

<Request>
    <name>johndoe</name>
    <Line />
    <address>      
        <operator/>
        <line1>XYZ</line1>
        <line2 />
        <city>ABC</city>
        <state>FL</state>
        <zipCode />
        <desc />
        <email />
        <phone />
    </address>
</Request>

输出:

<Request>
    <name>johndoe</name>
    <address>      
        <operator>NULL</operator>
        <line1>XYZ</line>
        <city>ABC</city>
        <state>FL</state>
    </address>
</Request>

我需要删除除operator之外的所有空元素,如果它是空的我需要传递NULL,否则需要传递任何输入

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">


   <xsl:template match="node()|@*">
      <xsl:copy>
         <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>    

    <xsl:template match="operator[not(text())]">
        <xsl:copy>
          <xsl:apply-templates select="@*"/>
          <xsl:text>NULL</xsl:text>
        </xsl:copy>
    </xsl:template>

    <!-- Removes empty nodes -->
    <xsl:template match="*[not(.//text() | .//@*)]"/>


</xsl:stylesheet>

但这也会删除operator元素。如何继续删除除运算符并在运算符为空时注入NULL

1 个答案:

答案 0 :(得分:2)

以这种方式试试吗?

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>    

<xsl:template match="operator[not(text())]" priority="1">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:text>NULL</xsl:text>
    </xsl:copy>
</xsl:template>

<!-- Removes empty nodes -->
<xsl:template match="*[not(.//text() | .//@*)]"/>

</xsl:stylesheet>

或者,如果您愿意:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>    

<xsl:template match="operator[not(text())]">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:text>NULL</xsl:text>
    </xsl:copy>
</xsl:template>

<!-- Removes empty nodes -->
<xsl:template match="*[not(.//text() | .//@*)][not(self::operator)]"/>

</xsl:stylesheet>