复制所有xml节点并使用XSLT 2在其中重命名

时间:2012-05-10 15:22:50

标签: xml xslt

我有一个XML,在XML中我有一个元素,它本身有几个元素,现在我想要的是复制每一个并更改标记名称。

XML结构:

<mothertag>
     <atag>
        asdfasdfa
     </atag>

     <storybody>
        <p>sometext here<URI ref="http://google.com" /> some more text</p>
     </storybody>

</mothertag>
  1. 我想将名称<storybody>更改为<body>
  2. 其他所有内容均应保持原样,并将<URI>更改为<a>
  3. 我正在为文档的其余部分做的是定义模板并逐个应用。现在我遇到了这个需要复制的东西,只需更改一些,名称也改变了。

2 个答案:

答案 0 :(得分:0)

要在XSLT中执行此操作,您只需要一个基本的身份转换,<storybody>元素除外。

这样的事情:

<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="storybody">
    <body>
      <xsl:apply-templates select="@*|node()"/>
    </body>
  </xsl:template>

</xsl:stylesheet>

修改

我已阅读您的评论&#34;我不想使用身份转换。相反,我需要对文档中的一个元素使用身份转换&#34; ,并且不清楚您需要什么。也许您对文档的其余部分进行了转换,但是这个元素有问题吗?在这种情况下,除了你已经写好的内容之外,你应该只使用我答案中的第二个模板。

你邮件的第二部分在标记中部分丢失,但现在已经修复,我忽略了它。要将<URI>元素更改为<a>,您还应添加其他模板。假设您要将原始ref属性更改为href,则两者一起显示为

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

<xsl:template match="storybody//URI">
  <a>
    <xsl:attribute name="href">
      <xsl:value-of select="@ref" />
    </xsl:attribute>
  </a>
</xsl:template>

如果您的意图与此不同,请澄清,我们会进一步帮助您。

答案 1 :(得分:0)

目前还不清楚你想要做什么Touseef而没有你想要的结果XML的例子但是....

如果您需要丢弃大部分输入文档并保留一个标记,那么这种模式可能有所帮助:

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

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

   <xsl:template match="storybody">
       <xsl:copy-of select="."/>
   </xsl:template>

 </xsl:stylesheet>

我没有在我输入XSLT引擎的机器前面,所以我没有测试过这个。但是我的想法是将所有内容与第一个模板匹配,然后忽略它,除了我们只是复制到输出文档的storybody元素。

如果这没有帮助,那么我建议您提供一份所需的结果XML文档样本以及您希望应用的规则的明确声明