首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自父节点的内联xslt命名空间

来自父节点的内联xslt命名空间
EN

Stack Overflow用户
提问于 2011-06-27 15:39:42
回答 1查看 3K关注 0票数 1

这实际上是我的内联xslt:

代码语言:javascript
复制
<xsl:element name="ns0:LineItems" >
  <xsl:element name="ns0:Response" >
    <xsl:for-each select="//*[local-name()='Response']//*[local-name()='ITEMS']" >
      <xsl:element name="ns0:ITEMS" >
        <xsl:attribute name ="LINEITEMID" >
          <xsl:value-of select="*[local-name()='LINEITEMID']" />
        </xsl:attribute>
        <xsl:attribute name ="ITM_NUMBER" >
          <xsl:value-of select="*[local-name()='ITM_NUMBER']" />
        </xsl:attribute>
      </xsl:element>
    </xsl:for-each>
  </xsl:element>
</xsl:element>

我的问题是,如何从结果xml ns0:elmentname创建具有相同名称空间的新节点。当这个名称空间更改为ns1:elmentname时,我遇到了一个问题。

结果应该如下所示:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<ns0:LineItems xmlns:ns0="http://schemas.microsoft.com/BizTalk/2003">
  <ns0:Response>
    <ns0:ITEMS LINEITEMID="777" ITM_NUMBER="001000" />
    <ns0:ITEMS LINEITEMID="2" ITM_NUMBER="001055" />
    <ns0:ITEMS LINEITEMID="3" ITM_NUMBER="001020" />
  </ns0:Response>
</ns0:LineItems>

我的输入:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<Response>
  <HEADER>
    <ORDER_ID>1234</ORDER_ID>
  </HEADER>
  <E_SALESDOCUMENT>test123</E_SALESDOCUMENT>
  <E_STATUS>AllesToll</E_STATUS>
  <ITEMS>
    <LINEITEMID>777</LINEITEMID>
    <ITM_NUMBER>001000</ITM_NUMBER>
    <MATERIAL>000000000000219701</MATERIAL>
  </ET_ORDER_ITEMS>
  <ET_ORDER_ITEMS>
    <LINEITEMID>2</LINEITEMID>
    <ITM_NUMBER>001055</ITM_NUMBER>
    <MATERIAL>000000000000219702</MATERIAL>
  </ET_ORDER_ITEMS>
  <ET_ORDER_ITEMS>
    <LINEITEMID>3</LINEITEMID>
    <ITM_NUMBER>001020</ITM_NUMBER>
    <MATERIAL>000000000000219703</MATERIAL>
  </ITEMS>
</Response>
EN

回答 1

Stack Overflow用户

发布于 2011-06-27 16:22:40

您可以使用的namespace,并使用XPath namespace-uri(node-set)函数来确定当前的命名空间。示例:假设我们有这样的XML:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<root xmlns:a="a" xmlns:b="b">
    <a:item>
        <a:name>a</a:name>
    </a:item>
    <b:item>
        <b:name>b</b:name>
    </b:item>
</root>

因此,我们可以使用以下XSLT:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:a="a" xmlns:b="b"
>
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="root">
        <root>
            <xsl:apply-templates select="a:item | b:item"/>
        </root>
    </xsl:template>

    <xsl:template match="a:item | b:item">
        <xsl:element namespace="{namespace-uri(.)}" name="element">
            <xsl:value-of select="a:name | b:name"/>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

输出:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<root xmlns:a="a" xmlns:b="b">
  <element xmlns="a">a</element>
  <element xmlns="b">b</element>
</root>

因此,我们使用名称空间动态地构造XML。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6489905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档