输入:
<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
答案 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>