gpt4 book ai didi

XSLT:当元素存在时添加它并更改值否则添加具有值的元素

转载 作者:行者123 更新时间:2023-12-05 00:50:54 25 4
gpt4 key购买 nike

我的问题是,在某些 xml 文件中存在一个元素,而在另一个文件中则不存在。当元素存在时,它的值应该被改变。如果不存在,则应添加。

为了更好的理解,这里有一个例子:

<root>
<group>
<element1>SomeValue1</element1>
<element2>SomeValue2</element2>
</group>
</root>

假设我始终希望 element1、element2 和 element3 的值为 Changed1、Changed2、Changed3。

它应该是这样结束的:

<root>
<group>
<element1>Changed1</element1>
<element2>Changed2</element2>
<element3>Changed3</element3>
</group>
</root>

我该怎么做才能实现它?
感谢您的期待

丹尼斯

最佳答案

我不确定这是否是世界上最优雅的解决方案,但我认为这可能会满足您的需求:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<!-- If the element exists, do what you want to do -->
<xsl:template match="element1">
<xsl:copy>Changed1</xsl:copy>
</xsl:template>

<xsl:template match="element2">
<xsl:copy>Changed2</xsl:copy>
</xsl:template>

<xsl:template match="element3">
<xsl:copy>Changed3</xsl:copy>
</xsl:template>

<!-- If the element doesn't exist, add it -->
<xsl:template match="group">
<xsl:copy>
<xsl:apply-templates/>
<xsl:if test="not(element1)">
<element1>Changed1</element1>
</xsl:if>
<xsl:if test="not(element2)">
<element2>Changed2</element2>
</xsl:if>
<xsl:if test="not(element3)">
<element3>Changed3</element3>
</xsl:if>
</xsl:copy>
</xsl:template>

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

</xsl:stylesheet>

任何没有明确匹配的东西都应该原封不动地复制。

当然,如果值是常量(即 element1、element2 和 element3 将始终具有相同的值,无论它们是新的还是更新的),那么您可以有更简单的方法:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<!-- If the element exists, remove it -->
<xsl:template match="element1 | element2 | element3"/>

<!-- Now put in your preferred elements -->
<xsl:template match="group">
<xsl:copy>
<xsl:apply-templates/>
<element1>Changed1</element1>
<element2>Changed2</element2>
<element3>Changed3</element3>
</xsl:copy>
</xsl:template>

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

</xsl:stylesheet>

这基本上删除了原始的“元素”节点并将您的节点放在原处。

关于XSLT:当元素存在时添加它并更改值否则添加具有值的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3889432/

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