1

以前从未做过 XSLT。是否可以继承文档并仅替换一个标签?如果是,你能提供任何例子吗?

谢谢

4

2 回答 2

3

你从模板开始

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

然后你添加模板来转换你想要转换的节点,例如

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

将所有td元素转换为th元素或

<xsl:template match="h6"/>

删除所有h6元素。

如果你想转换一个单一的td那么你需要一些方法来识别它,假设它有一个id属性使用一个匹配模式,比如

<xsl:template match="td[@id = 'td1']">
  <td style="background-color: lightgreen;">
    <xsl:apply-templates select="@* | node()"/>
  </td>
</xsl:template>

该示例设置特定元素的 CSSbackground-color属性。td

于 2012-10-23T09:52:41.567 回答
0

最好使用最基本的 XSLT 设计模式来处理此任务:使用和覆盖标识规则

让我们拥有这个 XML 文档:

<root>
   <x>This is:</x>
   <a>
      <b>
         <c>hello</c>
      </b>
   </a>
   <a>
      <b>
         <c1>world</c1>
      </b>
   </a>
   <a>
      <b>!</b>
   </a>
   <y>The End</y>
</root>

任务是

  1. 删除所有c元素。

  2. 将任何b元素重命名为d.

  3. c2在任何元素之后插入一个c1元素。

解决方案非常简短

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="c"/>

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

 <xsl:template match="c1">
  <xsl:call-template name="identity"/>
  <c2>xxx</c2>
 </xsl:template>
</xsl:stylesheet>

当对上述 XML 文档应用此转换时,会产生所需的正确结果

<root>
   <x>This is:</x>
   <a>
      <d/>
   </a>
   <a>
      <d>
         <c1>world</c1>
         <c2>xxx</c2>
      </d>
   </a>
   <a>
      <d>!</d>
   </a>
   <y>The End</y>
</root>

说明

  1. 身份模板在选择执行或按名称调用时,会“按原样”复制当前节点。

  2. 对于每个特殊任务(删除、插入和重命名),我们添加一个单独的模板来匹配所需的节点,从而覆盖身份模板,因为它具有更高的特异性。

  3. 选择覆盖的、更具体的模板在它匹配的节点上执行,并执行我们需要执行的任务。

于 2012-10-23T12:14:05.340 回答