猿问

如何使用 XLS 转换复制 XML 节点并粘贴到同一级别

我想复制一个 xml 的节点并将其粘贴到同一级别。


考虑我有一个 xml,如下所示。


<MyXml>

    <system>

        <Groups>

            <Group id="01" check="true">

            <name>Value</name>

            <age>test</age>

        </Group>

        <Group id="02" check="true">

            <name>Value</name>

            <age>test</age>

        </Group>

        <Group id="03" check="true">

            <name>Value</name>

            <age>test</age>

        </Group>

        </Groups>

  </system>

</MyXml>

我想复制组 03 并使用 XSL 转换粘贴到与“04”相同的级别(组内)。


预期产出

<MyXml>

    <system>

        <Groups>

            <Group id="01" check="true">

                <name>Value</name>

                <age>test</age>

            </Group>

            <Group id="02" check="true">

                <name>Value</name>

                <age>test</age>

            </Group>

            <Group id="03" check="true">

                <name>Value</name>

                <age>test</age>

            </Group>

            <Group id="04" check="true">

                <name>Value</name>

                <age>test</age>

            </Group>

        </Groups>

  </system>

</MyXml>

有人可以帮忙完成相同的 XSL 样式表。不确定下面的 xsl 是否正确。提前致谢。


<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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


<xsl:param name="groupId" />

<xsl:param name="newGroupId" />


<xsl:template match="node()|@*" name="identity">

  <xsl:copy>

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

  </xsl:copy>

 </xsl:template>


<xsl:template match="MyXML/system/Groups/Group[@id=$groupId]" >

 <xsl:copy>

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

            <!--Wanted to do something for pasting the copied node and changing the id value with new Group Id.-->

  </xsl:copy>

</xsl:template>

</xsl:stylesheet>


拉风的咖菲猫
浏览 116回答 1
1回答

慕码人2483693

在 XSLT 1.0 中,在模板匹配中包含变量表达式实际上被认为是错误的(尽管您可能会发现某些处理器允许这样做)。但是你可能应该做的,就是在模板匹配中调用身份模板Group,然后有一个xsl:if决定是否复制它。试试这个模板<xsl:template match="Group" >&nbsp; <xsl:call-template name="identity" />;&nbsp; <xsl:if test="@id = $groupId">&nbsp; &nbsp; <group id="{$newGroupId}">&nbsp; &nbsp; &nbsp; <xsl:apply-templates select="@*[name() != 'id']|node()"/>&nbsp; &nbsp; </group>&nbsp; </xsl:if></xsl:template>请注意,您不需要Group模板匹配中的完整路径,除非Group您不想匹配其他级别的元素。(此外,MyXML当您的 XML 将其设为MyXml.XSLT时,您当前的匹配指的是 。XSLT 区分大小写,因此不会匹配)。
随时随地看视频慕课网APP

相关分类

Java
我要回答