删除特定值XML但使用XSLT 1.0保留标记名称

时间:2017-10-04 16:34:21

标签: xslt

我想从XML中删除特定值,但保留标记名称。我见过相反的例子(删除标签但保留值)。这是我的XML:

<Result>
    <Max>100</Max>
    <Min>10</Min>
    <Range>90</Range>
    <ResultPoints>
        <ResultP1>.</ResultP1>
    <ResultP2>.</ResultP2>
    <ResultP3>.</ResultP3>
    <ResultP4>.</ResultP4>
    <ResultP5>.</ResultP5>
    </ResultPoints>
</Result>

我想删除'。'但保留标签名称,以便我的XML看起来像这样:

<Result>
    <Max>100</Max>
    <Min>10</Min>
    <Range>90</Range>
    <ResultPoints>
    <ResultP1/>
    <ResultP2/>
    <ResultP3/>
    <ResultP4/>
    <ResultP5/>
    </ResultPoints>
</Result>

这是我的XLT。这将完全删除ResultPn标记。

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

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

<xsl:template match="*[. = '.']">
<xsl:value-of select="''"/>
</xsl:template> 

</xsl:stylesheet>

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

您只需在模板中执行xsl:copy即可复制您匹配的元素。请注意,您并不需要在此处输出空字符串。

试试这个XSLT

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

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

<xsl:template match="*[. = '.']">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
    </xsl:copy>
</xsl:template> 

</xsl:stylesheet>

注意,我添加了xsl:apply-templates来复制任何现有属性。

或者,你可以用这个替换第二个模板(它直接匹配文本节点,而不是父元素)

 <xsl:template match="text()[. = '.']" />