XSLT模板:只是复制子元素

时间:2013-10-10 18:41:40

标签: xml xslt

我是XSLT转换的新手。
它是我之前question的扩展。现在我正在复制这样的所有节点,然后根据前一个question的答案对它们进行转换。

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

但输入有两个父元素。

<Parent1>
  <Parent11>
    <Element1>
    <!--Rest of the xml I want to work with-->
    </Element1>
   <Parent11>
  <Parent21>
   <Other></Other>
  </Parent21>
<Parent1>

我尝试使用

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

然后它以纯文本形式返回xml值。使用<Parent21>个孩子的值 基于我试过的答案

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

这没有给我任何回报。

1 个答案:

答案 0 :(得分:0)

如果您只想处理Element1,请保留通常的身份模板

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

并为/添加另一个模板:

<xsl:template match="/">
  <xsl:apply-templates select="Parent1/Parent11/Element1"/>
</xsl:template>

这将直接“跳过”Element1并从那里继续正常处理,忽略文档的其余部分。然后,您可以使用与Element1内的节点匹配的其他模板来执行您需要的任何其他处理。

如果文档中有多个Element1,那么你需要在它们周围包裹一个根元素,以使输出良好,例如。

<xsl:template match="/">
  <root>
    <xsl:apply-templates select="Parent1/Parent11/Element1"/>
  </root>
</xsl:template>