使用XSLT修改xml文档
发布时间:2020-12-16 22:55:04 所属栏目:百科 来源:网络整理
导读:我试图了解是否有办法使用XSLT修改xml文档,还是有比XSLT更好的方法? 说,我有一个像这样的xml: feed xmlns="http://www.w3.org/2005/Atom"idhttp://libx.org/libx2/libapps/identryidhttp://libx.org/libx2/libapps/2/id/entryentryidhttp://libx.org/libx2
我试图了解是否有办法使用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> 我想做以下的行动: >修改Feed:id to(删除feed文本:id) 结果xml看起来应该是这样的: <feed xmlns="http://www.w3.org/2005/Atom"> <id></id> <entry> <id>2</id> </entry> <entry> <id>3</id> </entry> </feed> 谢谢, 解决方法
I. 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> 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> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |