0

谈到 XSLT,我是个菜鸟。因此,如果这个问题达到基本标准,请多多包涵。

这是我使用的 XML 示例

<?xml version="1.0"?>
  <Types>
    <channels>
      <name>
        <id>0</id>
      </name>
      <channel_1>
        <id>1</id>
      </channel_1>
      <channel_2>
        <id>2</id>
      </channel_2>
      <channel_3>
        <id>3</id>
      </channel_3>
      <soschannel_4>
        <id>3</id>
      </soschannel_4>
    </channels>
  </Types>

预期结果:(仅允许在 'channels' 元素中以名称 'channel_' 开头的 XML 元素)

<?xml version="1.0"?>
  <Types>
    <channels>
      <channel_1>
        <id>1</id>
      </channel_1>
      <channel_2>
        <id>2</id>
      </channel_2>
      <channel_3>
        <id>3</id>
      </channel_3>
    </channels>
  </Types>
4

2 回答 2

2

这可以使用修改后的恒等变换轻松实现:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>

    <!--identity template, copies all content as default behavior-->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="channels">
        <!--copy the element-->
        <xsl:copy>
            <!--handle any attributes, comments, and processing-instructions 
                (not present in your example xml, but here for completeness) -->
            <xsl:apply-templates select="@* | 
                                        comment() | 
                                        processing-instruction()"/>
            <!--only process the child elements whos names start with 'channel_' 
                any others will be ignored-->
            <xsl:apply-templates 
                              select="*[starts-with(local-name(), 'channel_')]"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>
于 2013-06-12T17:10:18.120 回答
2

你想要一个有两个规则的样式表:

身份规则

<xsl:template match="*">
  <xsl:copy><xsl:apply-templates/></xsl:copy>
</xsl:template>

以及通道的特殊规则:

<xsl:template match="channels">
  <xsl:copy>
    <xsl:apply-templates select="*[starts-with(name(), 'channel')]"/>
  </xsl:copy>
</xsl:template>
于 2013-06-12T17:11:21.867 回答