我试图了解是否有办法使用XSLT修改xml文档,还是有比XSLT更好的方法? 说,我有一个像这样的xml: feed xmlns="http://www.w3.org/2005/Atom"idhttp://libx.org/libx2/libapps/identryidhttp://libx.org/libx2/libapps/2/i
说,我有一个像这样的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:id to(删除feed文本:id)
>修改条目: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转换适用于任何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>
II. 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>