【问题标题】:Extracting namespace-prefix from an XML using XSLT使用 XSLT 从 XML 中提取名称空间前缀
【发布时间】:2011-12-09 17:08:52
【问题描述】:

我有一个 SOAP XML。我需要将 XML 放入一个变量中,然后我必须使用 XSLT 从该变量中提取名称空间前缀。

例如,如果我的 XML 是,

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:out="http://soap.sforce.com/2005/09/outbound" xmlns:urn="urn:sobject.enterprise.soap.sforce.com">
    <soapenv:Header/>
    <soapenv:Body>
        <a>
            <s>sakdjhkjh</s>
            <j>jhgkjhkjd</j>
        </a>
    </soapenv:Body>
</soapenv:Envelope>

我必须将它放入一个名为 input(&lt;xsl:variable name="input"&gt;&lt;xsl:copy-of select="."/&gt;&lt;/xsl:variable&gt;) 的变量中。

现在,我必须从这个变量 ($input) 中提取命名空间前缀“soapenv”。

如果我的数据是,

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:out="http://soap.sforce.com/2005/09/outbound" xmlns:urn="urn:sobject.enterprise.soap.sforce.com">
    <soap:Header/>
    <soap:Body>
        <a>
            <s>sakdjhkjh</s>
            <j>jhgkjhkjd</j>
        </a>
    </soap:Body>
</soap:Envelope>

那么我必须在我的 XSLT 输出中添加肥皂。

谁能帮帮我。

谢谢,

纳吉玛

【问题讨论】:

    标签: xslt xml-namespaces


    【解决方案1】:

    对于 XSLT 1.0,您应该使用 &lt;xsl:variable name="input" select="."/&gt; 而不是您拥有的那个,否则无法进行任何路径访问(因为您的变量包含 XSLT 1.0 中的结果树片段)。至于前缀,你可以试试substring-before(name($input/descendant-or-self::*), ':')

    【讨论】:

      【解决方案2】:

      在这些情况下,您还可以使用很少需要的namespace 轴。命名空间节点的值是命名空间 URI,命名空间节点的名称是命名空间前缀。为清楚起见,命名空间 URI 被定义为一个变量,然后被引用。

      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
          <xsl:template match="/">
      
              <!-- variable definitions -->
              <xsl:variable name="input" select="."/>
              <xsl:variable name="nsUri" select="'http://schemas.xmlsoap.org/soap/envelope/'"/>
      
              <!-- getting the namespace prefix -->
              <xsl:value-of select="name($input/*/namespace::*[. = $nsUri])"/>
          </xsl:template>
      </xsl:stylesheet>
      

      (虽然不常见,但某个命名空间 URI 可以有多个前缀,前缀可以在文档中重新定义,元素可以使用绑定到同一命名空间的不同前缀。此示例代码在根元素中搜索命名空间定义并返回给定 URI 的第一个前缀。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-14
        • 1970-01-01
        • 2011-07-13
        • 2012-07-29
        相关资源
        最近更新 更多