如何编写排除某些元素但包含其他元素的XSLT模板?

时间:2012-06-08 20:38:09

标签: xslt

如何编写一个XSLT模板,该模板采用所有非“元”和“答案”元素并将它们存入“my_question”模板?因此,例如,给出以下XML ...

<question>
    <meta>
        ...
    </meta>
    <para />
    <para>Why?</para>
    <answer weight="1" correctness="0">
        ...
    </answer>
    <answer weight="1" correctness="0">
        ...
    </answer>
    <answer weight="1" correctness="100">
        ...
    </answer>
    <answer weight="1" correctness="0">
        ...
    </answer>
</question>

我希望结果是

<my_question>
    <para />
    <para>Why?</para>        
</my_question>

2 个答案:

答案 0 :(得分:1)

您从身份模板开始:

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

运行它,你会看到,一切都将被改变。

然后,您有选择地删除节点,例如像这样:

<xsl:template match="answer" />

请阅读此链接以获取更多信息:http://www.xmlplease.com/xsltidentity 它非常详细。祝你好运!

答案 1 :(得分:1)

身份模板是您的朋友

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

 <xsl:output method="xml" encoding="utf-8" indent="yes"/>

 <xsl:template match="/">
     <my_question>
        <xsl:apply-templates select="question"/>
     </my_question>
 </xsl:template>

 <!-- ignores the specified elements. Adjust for nesting if necessary. -->
 <xsl:template match="meta | answer"/>

 <!-- Pass everything else -->
 <xsl:template match="@*|node()">
 <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
 </xsl:copy>
 </xsl:template>
</xsl:stylesheet>