如果
以先前问题的解决方案为基础,则可以轻松解决此问题:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="my:my"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:key name="kNSFor" match="namespace" use="@of"/> <xsl:variable name="vStylesheet" select="document('')"/> <xsl:variable name="vPop" as="element()*"> <item path="/create/article/@type">richtext</item> <item path="/create/article/@lang">en-us</item> <item path="/create/article[1]/id">1</item> <item path="/create/article[1]/description">bar</item> <item path="/create/article[1]/name[1]">foo</item> <item path="/create/article[1]/price[1]/amount">00.00</item> <item path="/create/article[1]/price[1]/currency">USD</item> <item path="/create/article[1]/price[2]/amount">11.11</item> <item path="/create/article[1]/price[2]/currency">AUD</item> <item path="/create/article[2]/id">2</item> <item path="/create/article[2]/description">some name</item> <item path="/create/article[2]/name[1]">some description</item> <item path="/create/article[2]/price[1]/amount">00.01</item> <item path="/create/article[2]/price[1]/currency">USD</item> <namespace of="create" prefix="ns1:" url="http://predic8.com/wsdl/material/ArticleService/1/"/> <namespace of="article" prefix="ns1:" url="xmlns:ns1='http://predic8.com/material/1/"/> <namespace of="@lang" prefix="xml:" url="http://www.w3.org/XML/1998/namespace"/> <namespace of="price" prefix="ns1:" url="xmlns:ns1='http://predic8.com/material/1/"/> <namespace of="id" prefix="ns1:" url="xmlns:ns1='http://predic8.com/material/1/"/> </xsl:variable> <xsl:template match="/"> <xsl:sequence select="my:subTree($vPop/@path/concat(.,'/',string(..)))"/> </xsl:template> <xsl:function name="my:subTree" as="node()*"> <xsl:param name="pPaths" as="xs:string*"/> <xsl:for-each-group select="$pPaths" group-adjacent= "substring-before(substring-after(concat(., '/'), '/'), '/')"> <xsl:if test="current-grouping-key()"> <xsl:choose><xsl:when test= "substring-after(current-group()[1], current-grouping-key())"> <xsl:variable name="vLocal-name" select= "substring-before(concat(current-grouping-key(), '['), '[')"/> <xsl:variable name="vNamespace" select="key('kNSFor', $vLocal-name, $vStylesheet)"/> <xsl:choose> <xsl:when test="starts-with($vLocal-name, '@')"> <xsl:attribute name= "{$vNamespace/@prefix}{substring($vLocal-name,2)}" namespace="{$vNamespace/@url}"> <xsl:value-of select= "substring( substring-after(current-group(), current-grouping-key()), 2 )"/> </xsl:attribute> </xsl:when> <xsl:otherwise> <xsl:element name="{$vNamespace/@prefix}{$vLocal-name}" namespace="{$vNamespace/@url}"> <xsl:sequence select= "my:subTree(for $s in current-group() return concat('/',substring-after(substring($s, 2),'/')) ) "/> </xsl:element> </xsl:otherwise> </xsl:choose></xsl:when><xsl:otherwise> <xsl:value-of select="current-grouping-key()"/></xsl:otherwise> </xsl:choose> </xsl:if> </xsl:for-each-group> </xsl:function></xsl:stylesheet>
当此转换应用于任何XML文档(未使用)时,将产生所需的正确结果 :
<ns1:create xmlns:ns1="http://predic8.com/wsdl/material/ArticleService/1/"> <ns1:article xmlns:ns1="xmlns:ns1='http://predic8.com/material/1/" type="richtext" xml:lang="en-us"/> <ns1:article xmlns:ns1="xmlns:ns1='http://predic8.com/material/1/"> <ns1:id>1</ns1:id> <description>bar</description> <name>foo</name> <ns1:price> <amount>00.00</amount> <currency>USD</currency> </ns1:price> <ns1:price> <amount>11.11</amount> <currency>AUD</currency> </ns1:price> </ns1:article> <ns1:article xmlns:ns1="xmlns:ns1='http://predic8.com/material/1/"> <ns1:id>2</ns1:id> <description>some name</description> <name>some description</name> <ns1:price> <amount>00.01</amount> <currency>USD</currency> </ns1:price> </ns1:article></ns1:create>
说明 :
可以合理地假设,在整个生成的文档中,具有相同元素的任何两个元素都
local-name()
属于同一名称空间-这涵盖了现实世界中XML文档的绝大多数。名称空间规范遵循路径规范。nsmespace规范具有以下形式:
<namespace of="target element's local-name" prefix="wanted prefix" url="namespace-uri"/>
在使用生成元素之前
xsl:element
,使用xsl:key
。创建的索引选择适当的名称空间规范。根据此名称空间规范,其值prefix
和url
属性用于在xsl:element
指令中指定完整元素名称和元素的namespace-uri的值。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)