使用 xsl 文件将 xml 属性的内容复制到 xml 元素中

copy the content of an xml attribute into an xml element using an xsl file

我有 xml 文件的以下部分

<ns1:Main ns1:IdentifiantMain="token_new" ns1:Operation="Aucune">
          <ns1:elementA>token_old</elementA>
        </ns1:Main>

我想进行转换以创建新的 xml,如下所示:

<ns1:Main ns1:IdentifiantMain="token_new" ns1:Operation="Aucune">
      <ns1:elementB>token_new</elementB>
    </ns1:Main>

基本上旧元素被删除,新元素 "elementB" 填充属性内容 "ns1:IdentifiantMain"

我试过使用followint xsl文件,但实际上。没用。

    <?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet version="2.0" xmlns="http://xml.rsi.fr/schema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://xml.rsi.fr/schema">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="ns1:Main">
    <xsl:copy-of select="."/>
        <ns1:elementB>
            <xsl:value-of select = "@ns1:elementB/ns1:IdentifiantMain"/>
        </ns1:elementB> 
    </xsl:template>
</xsl:stylesheet>

有什么提示吗?

xsl:copy-of 是一个深拷贝,它将复制 ns1:Main 元素及其后代。由于您想更改子元素,因此您需要使用 xs:copy.

xsl:copy 是浅拷贝,只复制 ns1:Main 元素。如果您还想复制它的属性,则可以添加 <xsl:copy-of select="@*"/> 来显式复制属性,或者添加 <xsl:apply-templates match="@*"/> 来查找任何匹配的模板并点击上面的通用身份模板,这将复制属性.然后,里面的ns1:elementB,select的值为@ns1:IdentifiantMain。由于您的模板匹配 ns1:Main,这是您的 XPath 相对于的上下文。

<xsl:template match="ns1:Main">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <ns1:elementB>
      <xsl:value-of select = "@ns1:IdentifiantMain"/>
    </ns1:elementB> 
  </xsl:copy>
</xsl:template>

或者,不匹配 ns1:Main 元素,而是匹配要替换的元素 ns1:elementA。然后,不要在模板中复制该元素,而是构建 ns1:elementB,然后获取 ns1:elementA 的父元素的 @ns1:IdentifiantMain.

的值
<xsl:stylesheet version="2.0" xmlns="http://xml.rsi.fr/schema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://xml.rsi.fr/schema">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="ns1:elementA">
        <ns1:elementB>
            <xsl:value-of select="../@ns1:IdentifiantMain"/>
        </ns1:elementB> 
    </xsl:template>
</xsl:stylesheet>