XSLT删除具有属性的元素但保留子元素

时间:2013-06-13 01:04:44

标签: xslt-2.0

我需要将xml / html文件转换为dita文件。我想删除一些节点但保留他们的孩子。困难是:

  1. 我要删除的节点有属性。我收到错误:

      

    在子节点之后无法创建属性节点(类)   包含元素

  2. 这些属性是不可预测的:我想删除各种节点,我无法预测它们具有哪种属性。

  3. 我不知道节点嵌入的深度。它可以是<body>的直接子节点,也可以在其他节点内嵌套4或5级。

  4. XML示例:

    <macro name="section">
       <rich-text-body>
          <macro name="column">
             <parameter name="width">80%</parameter>
             <rich-text-body>
                <p>horribly nested, <span>bulky</span> structure</p>
                <div>horribly nested, <span>bulky</span> structure</div>
             </rich-text-body>
          </macro>
       </rich-text-body>
    </macro>
    

    我想删除庞大的宏标记,但只保留最内层<rich-text-body>的子项。在这种情况下,它们是<p> <div>标记。

    这是我得到的。 XSLT

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="macro[@name='column' and parameter[@name='width'] ='80%']">
        <xsl:apply-templates select="node()|@*"/>
    </xsl:template>
    

    任何帮助表示赞赏!谢谢!

1 个答案:

答案 0 :(得分:1)

正如已经建议的那样,如果你改变了

<xsl:template match="macro[@name='column' and parameter[@name='width'] ='80%']">
    <xsl:apply-templates select="node()|@*"/>
</xsl:template>

<xsl:template match="macro[@name='column' and parameter[@name='width'] ='80%']">
    <xsl:apply-templates select="node()"/>
</xsl:template>

分别相当但更短

<xsl:template match="macro[@name='column' and parameter[@name='width'] ='80%']">
    <xsl:apply-templates/>
</xsl:template>

然后您不会从macro元素的属性中获得任何错误,因为它们未被处理。

如果您想处理它们以将它们添加到其他元素,那么您需要准确地向我们展示您想要放置它们的位置。