gpt4 book ai didi

xslt - 使用 Xslt 复制节点并为属性添加值

转载 作者:行者123 更新时间:2023-12-03 06:50:23 26 4
gpt4 key购买 nike

Basiccly 我有 xml 和 xslt 的问题,我不知道如何解决,希望能从哪里开始解决这个问题。我有 XML:

<root>
<test value="1" setting="3">
<tag1>data....</tag1>
<tag2>data....</tag2>
<tag n+1>data....</tag n+1>
</test>
<test value ...
.
.
.
</test>
</root>

现在我现在需要以这种方式复制“测试”节点中的所有节点,并将始终值 3 添加到设置值(测试节点中的设置值正在更改)中,如下所示,这样我会得到:
<root>
<test value="2" setting="6">
<ni1 name="1" setting1="6">data....</ni1>
<ni2 name="1" setting1="6">data....</ni2>
<ni3 name="1" setting1="6">data....</ni3>
<ni4 name="1" setting1="6">data....</ni4>
<tag1>data....</tag1>
<tag2>data....</tag2>
<tag n+1>data....</tag n+1>
</test>
<test value ...
.
.
.
</test>
</root>

非常感谢您对此事的任何帮助,
奥格拉西

最佳答案

如评论中所述,identity transform 是您在转换 XML 并且只想对 XML 的某些部分进行更改时所需要的

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

您说要“向设置中添加始终值为 3”,因此您将拥有一个与 设置 属性匹配的模板。
<xsl:template match="test/@setting">

(在这种情况下,它只会匹配属于 测试 元素的 设置 属性。)

然后在这个模板中使用 xsl:attribute 输出一个新的属性,而不是使用相同的名称但修改后的值
<xsl:attribute name="setting">
<xsl:value-of select="number(.) + 3" />
</xsl:attribute>

你说你还想复制 测试 节点下的 4 个节点。这意味着您需要一个模板来匹配 测试 节点,因为这是添加子节点所需的转换
<xsl:template match="test">
<xsl:copy>
<xsl:apply-templates select="@*" />
<!-- Add new nodes here -->
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>

不清楚新节点的数据来自哪里,因此您必须自己做,但看起来 设置 属性确实来自 test 元素上的 设置 属性。因此,您的代码可能如下所示:
<ni1 name="1" setting1="{number(@setting) + 3}">data....</ni1>

请注意此处使用的属性值模板。花括号 { } 表示要计算的表达式,而不是按字面意思输出。

试试这个 XSLT 作为示例。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="test/@setting">
<xsl:attribute name="setting">
<xsl:value-of select="number(.) + 3" />
</xsl:attribute>
</xsl:template>

<xsl:template match="test">
<xsl:copy>
<xsl:apply-templates select="@*" />
<ni1 name="1" setting1="{number(@setting) + 3}">data....</ni1>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

关于xslt - 使用 Xslt 复制节点并为属性添加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20355009/

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