使用xslt删除不需要的嵌套元素

时间:2013-07-09 09:27:53

标签: xml xslt

在某些输出中,我们有一些不需要的嵌套标记。 xsl'em最简单的方法是什么?

来源-示例:

<body>
    <bo>
            <bo>some text</bo>
            <bo>
                <bo>some other text</bo>
            </bo>
            <bo>more text</bo>
    </bo>
    <bo>
        <fig/>
    <bo/>
</body>

结果示例:

<body>
    <p>some text</p>
    <p>some other text</p>
    <p>more text</p>
    <p>
        <fig/
    <p>
</body>

Thanx in Advanced。

2 个答案:

答案 0 :(得分:2)

采取以下措施构建:

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


<xsl:template match="bo[.//bo]">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="boo[not(boo)]">
  <p>
    <xsl:apply-templates/>
  </p>
</xsl:template>

如果这还不够,那么您需要更详细地解释您可以拥有哪些输入变体以及如何转换它们。

使用上述模板的完整样式表是

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

<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>

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


<xsl:template match="bo[.//bo]">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="boo[not(boo)]">
  <p>
    <xsl:apply-templates/>
  </p>
</xsl:template>

</xsl:stylesheet>

并转换

<body>
    <bo>
            <bo>some text</bo>
            <bo>
                <bo>some other text</bo>
            </bo>
            <bo>more text</bo>
    </bo>
    <bo>
        <fig/>
    </bo>
</body>

<body>
   <bo>some text</bo>
   <bo>some other text</bo>
   <bo>more text</bo>
   <bo>
      <fig/>
   </bo>
</body>

答案 1 :(得分:0)

省略直接嵌套在彼此内部的相同标签的一般解决方案:

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

    <template match="*[name(..)=name()]">
        <apply-templates/>
    </template>

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

</stylesheet>

英文:“复制每个节点,除非其名称与其父节点相同;在这种情况下,只需复制子节点”