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



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

最新更新