gpt4 book ai didi

xml - 使用 XSLT 修改 xml 文档

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

我想知道是否有一种方法可以使用 XSLT 修改 xml 文档,或者是否有比 XSLT 更好的方法?

比如说,我有一个这样的 xml:

<feed xmlns="http://www.w3.org/2005/Atom">
<id>http://libx.org/libx2/libapps</id>
<entry>
<id>http://libx.org/libx2/libapps/2</id>
</entry>
<entry>
<id>http://libx.org/libx2/libapps/3</id>
</entry>
</feed>

我想执行以下操作:

  1. 修改feed:id为(去掉feed:id的文字)
  2. 修改 entry:id 值,保留“/”后的最后一个数字值。

结果 xml 应如下所示:

<feed xmlns="http://www.w3.org/2005/Atom">
<id></id>
<entry>
<id>2</id>
</entry>
<entry>
<id>3</id>
</entry>
</feed>

谢谢,索尼

最佳答案

我。 XSLT 1.0 解决方案:

此 XSLT 1.0 转换适用于任何 url,无需对所有 url 具有共同的起始子字符串进行任何假设:

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

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

<xsl:template match="x:feed/x:id/node()"/>

<xsl:template match="x:entry/x:id/text()" name="eatSlashes">
<xsl:param name="pText" select="."/>

<xsl:choose>
<xsl:when test="not(contains($pText, '/'))">
<xsl:value-of select="$pText"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="eatSlashes">
<xsl:with-param name="pText" select=
"substring-after($pText, '/')"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<feed xmlns="http://www.w3.org/2005/Atom">
<id>http://libx.org/libx2/libapps</id>
<entry>
<id>http://libx.org/libx2/libapps/2</id>
</entry>
<entry>
<id>http://libx.org/libx2/libapps/3</id>
</entry>
</feed>

产生了想要的、正确的结果:

<feed xmlns="http://www.w3.org/2005/Atom">
<id/>
<entry>
<id>2</id>
</entry>
<entry>
<id>3</id>
</entry>
</feed>

二。 XSLT 2.0 解决方案:

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

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

<xsl:template match="x:feed/x:id/node()"/>

<xsl:template match="x:entry/x:id/text()">
<xsl:sequence select="tokenize(.,'/')[last()]"/>
</xsl:template>
</xsl:stylesheet>

当应用于相同的 XML 文档(如上)时,会产生相同的正确结果:

<feed xmlns="http://www.w3.org/2005/Atom">
<id/>
<entry>
<id>2</id>
</entry>
<entry>
<id>3</id>
</entry>
</feed>

关于xml - 使用 XSLT 修改 xml 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7451131/

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