【问题标题】:XML to XSLT Tranformation using Namespace not working使用命名空间的 XML 到 XSLT 转换不起作用
【发布时间】:2020-03-10 15:01:31
【问题描述】:

我有以下 XML,我能够根据我的预期输出进行转换和分组,但是当我尝试使用命名空间 xmlns="http://oracle.com/SGGIMDsEvents" 但从未奏效时。 以下 xml 示例输入

<?xml version="1.0" encoding="UTF-8"?>
<OrdersRoot xmlns="http://oracle.com/SGGIMDsEvents">
  <Order dateTimeTagFormat="xsd">
      <level>
        <OrderID>O1</OrderID>
        <ItemID>I1</ItemID>
        <TrackingID>T1</TrackingID>
    </level>
  </Order>
  <Order dateTimeTagFormat="xsd">
    <level>
        <OrderID>O1</OrderID>
        <ItemID>I2</ItemID>
        <TrackingID>T2</TrackingID>
    </level>
  </Order>
  <Order dateTimeTagFormat="xsd">
    <level>
        <OrderID>O1</OrderID>
        <ItemID>I2</ItemID>
        <TrackingID>T3</TrackingID>
    </level>
  </Order>
  <Order dateTimeTagFormat="xsd">
    <level>
        <OrderID>O2</OrderID>
        <ItemID>I3</ItemID>
        <TrackingID>T4</TrackingID>
    </level>
  </Order>
  <Order>
    <level>
        <OrderID>O2</OrderID>
        <ItemID>I3</ItemID>
        <TrackingID>T5</TrackingID>
    </level>
  </Order>
  <Order>
    <level>>
        <OrderID>O3</OrderID>
        <ItemID>I4</ItemID>
        <TrackingID>T6</TrackingID>
  </level>
  </Order>
</OrdersRoot>

XSLT 代码 - 某些部分仅用于命名空间测试,否则它工作正常 这里是运行此代码的链接 没有命名空间的 URL - https://xsltfiddle.liberty-development.net/gVhDDyC/3 带有命名空间的 URL - https://xsltfiddle.liberty-development.net/gVhDDyC/5

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:t="http://oracle.com/SGGIMDsEvents" 
xmlns="http://oracle.com/SGGIMDsEvents" 
exclude-result-prefixes="t" 
version="1.0" 

>

<xsl:output omit-xml-declaration="yes" method="xml" version="1.0" indent="yes" />

<!-- Create a key to match against groups in source schema -->
<xsl:key name="k1" match="t:Order/t:level" use="t:OrderID"/>

<!--<xsl:key name="k2" match="Order/level" use="concat(OrderID,'|',ItemID)"/>-->

<!--<xsl:key name="k3" match="Order/level" use="concat(OrderID,'|',ItemID,'|',TrackingID)"/>-->

<xsl:template match="/">
<xsl:apply-templates select="/t:OrdersRoot" />
</xsl:template>

<xsl:template match="/t:OrdersRoot">
    <orders>

      <!-- This will loop through our key ("OrderID") -->
      <xsl:for-each select="t:Order/level[generate-id(.)=generate-id(key('k1',t:OrderID))]">

        <order>
          <orderid>
            <xsl:value-of select="t:OrderID/text()" />
          </orderid>

           <!--Another loop 1 ... -->
          <!--<xsl:for-each select="key('k1',OrderID)[generate-id(.)=generate id(key('k2',concat(OrderID,'|',ItemID)))]">-->
          <!--  <items>-->
          <!--    <item>-->
          <!--      <xsl:value-of select="ItemID" />-->
          <!--    </item>-->

               <!--Another loop 2... -->
          <!--    <xsl:for-each select="key('k2',concat(OrderID,'|',ItemID))[generate-id(.)=generate-id(key('k3',concat(OrderID,'|',ItemID,'|',TrackingID)))]">-->
          <!--      <shippingdetails>-->
          <!--        <trackingcode>-->
          <!--          <xsl:value-of select="TrackingID"/>-->
          <!--        </trackingcode>-->
          <!--      </shippingdetails>-->
          <!--    </xsl:for-each>-->

          <!--  </items>-->
          <!--</xsl:for-each>-->


        </order>
      </xsl:for-each>
    </orders>
  </xsl:template>
</xsl:stylesheet>

如果我遗漏了什么或者我的方法有误,请告诉我?

谢谢

【问题讨论】:

    标签: xml xslt xslt-grouping


    【解决方案1】:

    对于该命名空间中的所有元素,您必须在所有路径表达式中使用前缀 t,因此您需要使用 t:level 而不是 levelhttps://xsltfiddle.liberty-development.net/gVhDDyC/8

    【讨论】:

      猜你喜欢
      • 2010-12-16
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      • 2018-06-27
      • 1970-01-01
      • 2021-08-26
      相关资源
      最近更新 更多