示例

时间:2017-01-20 12:39:22

标签: xml xslt

我有一个简单的xml:

<A>
  <b>
    <c att="1">TEXT <d>some other text</d></c>
  </b>
  <c att="1">TEXT 2</c>
</A>

我想将其转换为:

<A>
  <p>
    <span class="1">TEXT <d>some other text</d></span>
  </p>
  <span class="1">TEXT 2</span>
</A>

如何通过XSLT转换完成此操作?

我尝试过这个xslt

<xsl:template match="b">
    <xsl:element name="p">
      <xsl:copy-of select="node()"/>
    </xsl:element>
  </xsl:template>
<xsl:template match="c">
    <span>
      <xsl:attribute name="class">
        <xsl:value-of select="@att"/>
      </xsl:attribute>
    </span>
  </xsl:template>

这个结果

<A>
  <p>
    <c att="1">TEXT <d>some other text</d></c>
  </p>
  <span class="1">TEXT 2</span>
</A>

1 个答案:

答案 0 :(得分:0)

如你所说,这个例子确实很基本。

转换必须执行以下更改:

  1. b 元素更改为 p
  2. c 元素更改为 span
  3. att 属性更改为(保持其值)。
  4. 第一个任务执行模板匹配 b 元素。

    第二个 - 模板匹配 c 元素。

    第3个任务执行指令<xsl:attribute name="class" select="@att"/>

    要防止原始att属性在输出中复制, 嵌入式apply-templates仅在覆盖的后代节点上执行 node()函数,不包含属性。

    下面有一个完整的例子。

    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
      <xsl:output omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
      <xsl:strip-space elements="*"/>
    
      <xsl:template match="b">
        <p><xsl:apply-templates select="@*|node()"/></p>
      </xsl:template>
    
      <xsl:template match="c">
        <xsl:element name="span">
          <xsl:attribute name="class" select="@att"/>
          <xsl:apply-templates select="node()"/>
        </xsl:element>
      </xsl:template>
    
      <xsl:template match="@*|node()">
        <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
      </xsl:template>
    </xsl:transform>