用于从XML文件中删除标记的XSLT

时间:2011-09-06 01:32:31

标签: xml xslt xsd

我有这个XML文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<results>
  <output>
    <status>OK</status>
    <usage>Please use it</usage>
    <url/>
    <language>english</language>
    <category>science_technology</category>
    <score>0.838661</score>
  </output>
</results>

我想从此XML中删除标记<output> </output>

预计输出

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <results>
 <status>OK</status>
    <usage>Please use it</usage>
    <url/>
    <language>english</language>
    <category>science_technology</category>
    <score>0.838661</score>

</results>

我该怎么做?

2 个答案:

答案 0 :(得分:4)

最简单的方法(几乎是机械地,没有思考):

<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="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="output"><xsl:apply-templates/></xsl:template>
</xsl:stylesheet>

将此转换应用于提供的XML文档

<results>
  <output>
    <status>OK</status>
    <usage>Please use it</usage>
    <url/>
    <language>english</language>
    <category>science_technology</category>
    <score>0.838661</score>
  </output>
</results>

产生了想要的正确结果

<results>
   <status>OK</status>
   <usage>Please use it</usage>
   <url/>
   <language>english</language>
   <category>science_technology</category>
   <score>0.838661</score>
</results>

<强>解释

  1. 标识规则/模板“按原样”复制每个节点。

  2. 有一个模板会覆盖身份规则。它匹配任何output元素并阻止它被复制到输出,但继续处理它的任何子元素。

  3. 记住:覆盖身份规则是最基本,最强大的XSLT设计模式。

答案 1 :(得分:2)

尽可能短:

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

    <xsl:template match="results">
     <xsl:copy>
       <xsl:copy-of select="output/*"/>
     </xsl:copy>
    </xsl:template>

</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="results">
        <xsl:copy>
            <xsl:apply-templates select="output/*"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>