我想了解是否有一种方法可以使用 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>
Run Code Online (Sandbox Code Playgroud)
我想采取以下行动:
结果 xml 应该如下所示:
<feed xmlns="http://www.w3.org/2005/Atom">
<id></id>
<entry>
<id>2</id>
</entry>
<entry>
<id>3</id>
</entry>
</feed>
Run Code Online (Sandbox Code Playgroud)
谢谢,索尼
一、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>
Run Code Online (Sandbox Code Playgroud)
当应用于提供的 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>
Run Code Online (Sandbox Code Playgroud)
产生了想要的正确结果:
<feed xmlns="http://www.w3.org/2005/Atom">
<id/>
<entry>
<id>2</id>
</entry>
<entry>
<id>3</id>
</entry>
</feed>
Run Code Online (Sandbox Code Playgroud)
二. 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>
Run Code Online (Sandbox Code Playgroud)
当应用于同一个 XML 文档(如上)时,会产生相同的正确结果:
<feed xmlns="http://www.w3.org/2005/Atom">
<id/>
<entry>
<id>2</id>
</entry>
<entry>
<id>3</id>
</entry>
</feed>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3255 次 |
| 最近记录: |