使用 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>
我有 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>