为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉风的咖菲猫 2021-06-21 16:09:38
我想复制一个 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>
查看完整描述

1 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

在 XSLT 1.0 中,在模板匹配中包含变量表达式实际上被认为是错误的(尽管您可能会发现某些处理器允许这样做)。


但是你可能应该做的,就是在模板匹配中调用身份模板Group,然后有一个xsl:if决定是否复制它。


试试这个模板


<xsl:template match="Group" >

  <xsl:call-template name="identity" />;

  <xsl:if test="@id = $groupId">

    <group id="{$newGroupId}">

      <xsl:apply-templates select="@*[name() != 'id']|node()"/>

    </group>

  </xsl:if>

</xsl:template>

请注意,您不需要Group模板匹配中的完整路径,除非Group您不想匹配其他级别的元素。(此外,MyXML当您的 XML 将其设为MyXml.XSLT时,您当前的匹配指的是 。XSLT 区分大小写,因此不会匹配)。


查看完整回答
反对 回复 2021-06-23
  • 1 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信