gpt4 book ai didi

xml - 如何将值由 , 分隔的属性分解为单独的元素

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

我有一个属性,其值可能是一个或多个文本字符串,全部由逗号分隔。我希望使用 XSL 将属性值转换为它们自己的元素;

例如

<post title='Hello World" tags="Test,Hello,World />

我希望它转换成;

<post>
<title>Hello World</title>
<tag>Test</tag>
<tag>Hello</tag>
<tag>World</tag>
</post>

这可能吗?时间差

最佳答案

有几种方法可以做到这一点。

我。在 XSLT 1.0 中使用递归调用的命名模板这种转变:

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

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

<xsl:template match="@*[not(name()='tags')]">
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>

<xsl:template match="@tags">
<xsl:call-template name="tokenize">
<xsl:with-param name="pText"
select="concat(., ',')"/>
</xsl:call-template>
</xsl:template>

<xsl:template name="tokenize">
<xsl:param name="pText"/>

<xsl:if test="string-length($pText)">
<tag>
<xsl:value-of select=
"substring-before($pText, ',')"/>
</tag>

<xsl:call-template name="tokenize">
<xsl:with-param name="pText" select=
"substring-after($pText, ',')"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>

应用于最初提供的 XML 文档时(已更正为格式正确):

<post title="Hello World" 
tags="Test,Hello,World" />

产生所需的结果:

<post>
<title>Hello World</title>
<tag>Test</tag>
<tag>Hello</tag>
<tag>World</tag>
</post>

二。使用来自 FXSLstr-split-to-words 模板/函数1.x

此处 FXSL 提供 token 化功能:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common"
>

<xsl:import href="strSplit-to-Words.xsl"/>

<xsl:output indent="yes" omit-xml-declaration="yes"/>

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

<xsl:template match="@*[not(name()='tags')]">
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>

<xsl:template match="@tags">
<xsl:variable name="vwordNodes">
<xsl:call-template name="str-split-to-words">
<xsl:with-param name="pStr" select="."/>
<xsl:with-param name="pDelimiters"
select="','"/>
</xsl:call-template>
</xsl:variable>

<xsl:apply-templates select="ext:node-set($vwordNodes)/*"/>
</xsl:template>

<xsl:template match="word">
<tag>
<xsl:value-of select="."/>
</tag>
</xsl:template>

</xsl:stylesheet>

当应用于与以前相同的 XML 文档时,会产生相同的正确输出

III.使用 XPath 2.0 标准函数 tokenize()来自 XSLT 2.0 转换

如果可以使用 XSLT 2.0 处理器,这是最简单的方法。

以下 XSLT 2.0 转换:

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

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

<xsl:template match="@*[not(name()='tags')]">
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>

<xsl:template match="@tags">
<xsl:for-each select="tokenize(.,',')">
<tag><xsl:value-of select="."/></tag>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

再次应用于同一 XML 文档时会产生所需的结果。

关于xml - 如何将值由 , 分隔的属性分解为单独的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/544336/

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