gpt4 book ai didi

XSLT:将一个元素注入(inject)另一个元素

转载 作者:行者123 更新时间:2023-12-01 06:12:24 30 4
gpt4 key购买 nike

我需要将 xml 元素注入(inject)到另一个使用 id 元素加入的 xml 元素中。

例如:

<root>
<a>
<id>1</id>
<!-- other elements ... -->
</a>
<a>
<id>2</id>
<!-- other elements ... -->
</a>
<b>
<id>10</id>
<ref>1</ref>
<!-- other elements ... -->
</b>
<b>
<id>13</id>
<ref>2</ref>
<!-- other elements ... -->
</b>
<b>
<id>13</id>
<ref>1</ref>
<!-- other elements ... -->
</b>
</root>

我需要转换为:

<root>
<a>
<id>1</id>
<!-- other elements ... -->
<b>
<id>10</id>
<ref>1</ref>
<!-- other elements ... -->
</b>
<b>
<id>13</id>
<ref>1</ref>
<!-- other elements ... -->
</b>

</a>
<a>
<id>2</id>
<!-- other elements ... -->
<b>
<id>13</id>
<ref>2</ref>
<!-- other elements ... -->
</b>
</a>
</root>

在这种情况下,当 a/id 等于 b/ref 时,我将 b 元素加入到一个元素中。

是否可以使用 XSLT 进行此类转换?我该怎么做?

最佳答案

首先从身份模板开始,将节点按原样复制到输出文档

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

为了能够通过 ref 高效地查找 b 元素,考虑创建一个键:

<xsl:key name="b" match="b" use="ref" />

然后,您可以有一个模板来匹配 a 元素,您可以在其中正常输出 a 元素,并复制关联的 b 元素,使用键

<xsl:template match="a">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<xsl:copy-of select="key('b', id)" />
</xsl:copy>
</xsl:template>

最后,您需要一个模板来阻止身份模板正常输出 b 元素:

<xsl:template match="b" />

试试这个 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="b" match="b" use="ref" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="a">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<xsl:copy-of select="key('b', id)" />
</xsl:copy>
</xsl:template>

<xsl:template match="b" />
</xsl:stylesheet>

关于XSLT:将一个元素注入(inject)另一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24228904/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com