使用/ XSLT在现有元素周围添加父级

时间:2015-04-16 19:32:48

标签: xml xslt

现有代码段:

<article></article>

我希望添加结果元素(内容,头部,正文)。所以它看起来像这样:

<content>
<head></head>
<body>
 <article></article>
</body>
<content>

两种类型的插入元件 - 包裹在例如和元素之上,

这是我到目前为止所尝试的内容:

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

<xsl:template match="list">
  <list>
    <xsl:apply-templates select="@* | *"/>
    <newelement>
  </list>
</xsl:template>

我对模板匹配/应用感到困惑。

1 个答案:

答案 0 :(得分:1)

如果您认为您提供的样式表片段会执行与您所描述内容类似的任何操作,那么您确实很困惑。至少你包括一个身份变换 - 这通常是一个好的开始。

模板元素的match属性用于将该元素与应该应用的输入树的元素相关联。它是一个XPATH表达式,可能多次使用各种节点作为上下文节点进行求值。由于您希望对<article>元素执行不同于大多数元素的转换,因此您需要一个与其匹配而不是其他元素的模板。

假设您希望将模板与每个<article>元素匹配,无论它出现在树中,而不是任何其他节点,拼写为match='article'。这样的匹配比您的身份转换中的匹配更具体,因此应该优先选择这样的模板,而不是<article>元素的身份转换。

将模板与感兴趣的元素匹配后,您需要指定它应该执行的转换。首先,您要复制<article>元素(我假设)其所有子节点。这看起来非常像你已经拥有的身份变换。第二,你想在<article>周围和之前添加元素;这些是你可以执行的一些最简单的转换,因为你可以从字面上表达它们。

那么,这是完成工作的一种方式:

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

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

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

</xsl:stylesheet>