当前位置: 首页 > 知识库问答 >
问题:

使用名称空间的XML到XSLT转换不起作用

宋望
2023-03-14

我有以下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命名空间为-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>

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

谢谢

共有1个答案

李烨烁
2023-03-14

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

 类似资料:
  • 我有这个xml是架构版本3.0http://www.test.com/Service/v3。我需要将其降级到版本1http://www.test.com/Service/v1.为此,我使用XSL来转换它。 但我得到这样的结果 在我的输出XML中,我得到了这个 为什么将其添加到NS2:消息中? 它不在输入xml中。 我遗漏了一些东西。如果有人能指出这个问题,我将不胜感激。 我希望在输出中创建以下内容

  • 问题内容: 我得到了以下XML: 跟随XPath不起作用意味着没有任何打印内容,例如“ data”元素不存在: /root/items/item/details/data 但是,当我删除“数据”元素的“ xmlns”名称空间属性时,将打印其内容。在不删除“数据”元素的“ xmlns”命名空间属性的情况下,xpath表达式应该如何工作? 我正在使用SAXON和XSL 1.0。 问题答案: 这是XPa

  • XML输入文件: XML输入文件转换为XML输出文件。将XML输入文件的firstName、middleName和lastName标签合并为XML Ouput文件的name标签,将XML输入文件的address1、address2、city、state和pincode标签合并为XML Ouput文件的address标签。 我几乎转换了代码,但我在这里与empId作斗争。我已经在XSLT文件中手动输

  • 我需要一个简单的xslt,它接受输入并提供如下所述的输出。我已经编写了xslt,但名称空间被忽略了。你能帮我一下吗。 输入消息: 预期输出消息: 实际输出消息: XSLT:

  • 我试图用XSLT处理器在PHP中转换xml文档,但我无法选择任何内容。。。我认为这是一个名称空间问题。如果我从一个干净的<代码> inputxml: Xsl-file: 我无法更改输入文件,因为它是由其他程序生成的。 安德烈

  • 我得到了(超过)两个Api POSTendpoint。每一个都需要一个json作为参数。但是当我在两个endpoint参数类中使用相同的类名负载时,Swagger就不起作用了。当我改变其中的一个,例如从有效载荷到有效载荷1时,它就不起作用了。当然,我在包装类中设置了正确的名称空间,以便它找到负载。但我希望每次都使用相同的名称“有效载荷”。如何使用相同的类名负载?在这两种情况下,我都可以保留json