复制节点后创建元素

Create element after having copied node

从 XML 数据复制后,希望创建第三个 link。 第三个元素不可见,我没有收到任何错误消息。

XSLT fiddle

数据:

<?xml version="1.0" encoding="utf-8" ?>
<section 
    xmlns:link="http://www.example.com/4"
    xmlns:xlink="http://www.example.com/5"
>
    <data>
        <link:schemaRef xlink:type="simple" xlink:href="http://example.com/1" />
        <link:schemaRef xlink:type="simple" xlink:href="http://example.com/2" />
    </data>
</section>

XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0"
    xmlns:link="http://www.example.com/4"
    xmlns:xlink="http://www.example.com/5"
>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/section">
    
    <body>
    
          <xsl:copy-of select="data" />

    </body>

</xsl:template>

<!-- Identity transform -->

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

<!-- Adding the 3rd link element -->
<xsl:template match="data">
   <xsl:copy>
     <xsl:copy-of select="@*" />
    <xsl:element name="link:schemaRef">
      <xsl:attribute name="xlink:type">simple</xsl:attribute>
      <xsl:attribute name="xlink:href">http://example.com/3</xsl:attribute>
    </xsl:element>
    <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
  
</xsl:stylesheet>

结果:

<?xml version="1.0" encoding="UTF-8"?>
<body xmlns:link="http://www.example.com/4" xmlns:xlink="http://www.example.com/5">
   <data>
        <link:schemaRef xlink:type="simple" xlink:href="http://example.com/1"/>
        <link:schemaRef xlink:type="simple" xlink:href="http://example.com/2"/>
    </data>
</body>

想要的结果:

<?xml version="1.0" encoding="UTF-8"?>
<body xmlns:link="http://www.example.com/4" xmlns:xlink="http://www.example.com/5">
   <data>
        <link:schemaRef xlink:type="simple" xlink:href="http://example.com/1"/>
        <link:schemaRef xlink:type="simple" xlink:href="http://example.com/2"/>
        <link:schemaRef xlink:type="simple" xlink:href="http://example.com/3"/>
    </data>
</body>

更改您的模板:

<xsl:template match="/section">
    <body>
          <xsl:copy-of select="data" />
    </body>
</xsl:template>

为此:

<xsl:template match="/section">
    <body>
          <xsl:apply-templates select="data"/>
    </body>
</xsl:template>

在您的原始代码中,仅复制数据,永远不会调用“数据”匹配模板。