gpt4 book ai didi

xml - 使用 XSLT 将多个可选的 XML 元素包装到一个新的包装器 XML 元素中

转载 作者:数据小太阳 更新时间:2023-10-29 02:27:52 25 4
gpt4 key购买 nike

我有一个如下所示的 XML 文件:

<a>
......
<b>
<c>
<c1>some text</c1>
</c>
<d>
<d1>some more text</d1>
<d1>even more text</d1>
</d>
<e>
<e1>some more text</e1>
<e1>even more text</e1>
</e>
</b>
</a>

我想包装元素 <d><e>进入 <wrapper>元素,所以我可以有类似下面的东西:

<a>
......
<b>
<c>
<c1>some text</c1>
</c>
<wrapper>
<d>
<d1>some more text</d1>
<d1>even more text</d1>
</d>
<e>
<e1>some more text</e1>
<e1>even more text</e1>
<e2>even more</e2>
</e>
</wrapper>
</b>
......
</a>

我面临的一个问题(除了我是 XSLT 的新手之外)是 <d><e>是可选的。

我该怎么做?

最佳答案

这个转换:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="b/*[self::d or self::e][1]">
<wrapper>
<xsl:apply-templates mode="copy" select=
". | following-sibling::*[self::d or self::e]"/>
</wrapper>
</xsl:template>

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

<xsl:template match="b/*[self::d or self::e][position()>1]"/>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<a>   ......   
<b>
<c>
<c1>some text</c1>
</c>
<d>
<d1>some more text</d1>
<d1>even more text</d1>
</d>
<e>
<e1>some more text</e1>
<e1>even more text</e1>
</e>
</b>
</a>

产生想要的结果:

<a>   ......   
<b>
<c>
<c1>some text</c1>
</c>
<wrapper>
<d>
<d1>some more text</d1>
<d1>even more text</d1>
</d>
<e>
<e1>some more text</e1>
<e1>even more text</e1>
</e>
</wrapper>
</b>
</a>

注意:重写身份规则 + 模式。

关于xml - 使用 XSLT 将多个可选的 XML 元素包装到一个新的包装器 XML 元素中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4925178/

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