2017-10-04 102 views
1

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

<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

您只需在模板中执行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()[. = '.']" /> 
+0

谢谢你,蒂姆更换第二模板!这正是我期待的! –