如何从一组XPath表达式生成XML文件?

如何从一组XPath表达式生成XML文件?,第1张

如何从一组XPath表达式生成XML文件?

如果
以先前问题的解决方案为
基础,则可以轻松解决此问题:

<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>

说明

  1. 可以合理地假设,在整个生成的文档中,具有相同元素的任何两个元素都

    local-name()
    属于同一名称空间-这涵盖了现实世界中XML文档的绝大多数。

  2. 名称空间规范遵循路径规范。nsmespace规范具有以下形式:

    <namespace of="target element's local-name" prefix="wanted prefix" url="namespace-uri"/>

  3. 在使用生成元素之前

    xsl:element
    ,使用
    xsl:key
    。创建的索引选择适当的名称空间规范。根据此名称空间规范,其值
    prefix
    url
    属性用于在
    xsl:element
    指令中指定完整元素名称和元素的namespace-uri的值。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5490027.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-13
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存