我有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>
基本上旧元素被remvo,而新元素" elementb"填充了属性的内容" ns1:dissineifiantmain"
我尝试使用lasterint 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
的内部,选择@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>