XSL转换帮助

时间:2011-03-12 22:59:53

标签: xml xslt transform

我目前有以下XML文件:

<Regions>
  <Region>
     <Code>AU</Code>
     <Name>Austria</Name>
  </Region>
</Regions>
<Channels>
    <Channel>
      <Code>00</Code>
      <Name>Im a channel</Name>
    </Channel>
    ...
</Channels>
<Programs>
   <Program>
      <Code>00</Code>
      <Name>Program</Name>          
   </Program>
</Programs>

我只想保留频道路径,以便输出看起来像这样使用XSLT:

<Channels>
    <Channel>
      <Code>00</Code>
      <Name>Im a channel</Name>
    </Channel>
    ...
</Channels>

1 个答案:

答案 0 :(得分:2)

此转化:

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

 <xsl:template match="/t/*[not(self::Channels)]"/>
</xsl:stylesheet>

应用于提供的XML文档(已修复为格式良好):

<t>
    <Regions>
        <Region>
            <Code>AU</Code>
            <Name>Austria</Name>
        </Region>
    </Regions>
    <Channels>
        <Channel>
            <Code>00</Code>
            <Name>Im a channel</Name>
        </Channel>    
    </Channels>
    <Programs>
        <Program>
            <Code>00</Code>
            <Name>Program</Name>
        </Program>
    </Programs>
</t>

会产生想要的正确结果:

<Channels>
   <Channel>
      <Code>00</Code>
      <Name>Im a channel</Name>
   </Channel>
</Channels>

<强>解释

使用身份规则,覆盖top元素(pass-through)和top元素的任何非Channels子元素(删除)。