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

时间:2011-06-27 07:39:42

标签: xml xslt biztalk

这实际上是我的内联xslt:

<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时,我遇到了问题。

结果应如下所示:

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

我的输入:

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

1 个答案:

答案 0 :(得分:0)

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

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

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

输出:

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