使用XSLTcopy时编辑一些标记

时间:2016-03-01 18:59:58

标签: templates xslt copy match

假设以下示例XML:

  <tag>
    <subtag1>value1</subtag1>
    <subtag2>value2</subtag2>
    <subtag3>value3</subtag3>
    <subtag4>value4</subtag4>
    <subtag5>value5</subtg5>
  </tag>

我希望获得所有标记部分,但进行一些更改,例如:

  <tag>
    <subtag1>value1</subtag1>
    <subtag2>value2</subtag2>
    <subtag3>value3</subtag3>
    <new-subtag4>value4</new-subtag4>
    <new-subtag5 type="new">value5</new-subtg5>
  </tag>

我尝试了以下脚本,但结果不正确。

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


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

 <xsl:template match="parent::subtag4">
  <xsl:element name="new-subtag4">
   <xsl:apply-templates select="@*|node()"/>
  </xsl:element>
 </xsl:template>

 <xsl:template match="parent::subtag5">
  <xsl:element name="new-subtag5" type="n">
   <xsl:apply-templates select="@*|node()"/>
  </xsl:element> 
 </xsl:template>

2 个答案:

答案 0 :(得分:1)

parent::subtag4不是有效的匹配模式。并且您无法像{I}那样向xsl:element添加属性。当元素的名称已知时,您也不需要使用xsl:element

尝试改为:

<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="subtag4">
    <new-subtag4>
        <xsl:apply-templates/>
    </new-subtag4>
</xsl:template>

<xsl:template match="subtag5">
    <new-subtag5 type="new">
        <xsl:apply-templates/>
    </new-subtag5>
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:1)

输出所需结果的XSLT如下。它只包含两个关于属性和parent::前缀删除的小修改。

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

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

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

 <xsl:template match="subtag5">
  <xsl:element name="new-subtag5">
   <xsl:attribute name="type">new</xsl:attribute>
   <xsl:apply-templates select="@*|node()"/>
  </xsl:element> 
 </xsl:template>

</xsl:stylesheet>