对于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>
答案 0 :(得分:2)
使用修改后的identity transform:
可以轻松实现<?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>
答案 1 :(得分: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>