xml - 使用命名空间的 XML 到 XSLT 转换不起作用
问题描述
我有以下 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>
如果我遗漏了什么或我的方法有误,请告诉我?
谢谢
解决方案
您必须t
在该命名空间中的所有元素的所有路径表达式中使用前缀,因此您需要的t:level
不是level
修复:https ://xsltfiddle.liberty-development.net/gVhDDyC/8
推荐阅读
- javascript - 从日期时间字符串获取偏移量并应用于新的日期对象
- database - 表分区和映射如何工作?
- java - JPanel 底部奇怪的白色边框
- javascript - 使用 jquery 删除动态创建的元素(带有单独的删除按钮)
- javascript - input `type=image` onclick 解决方案有效,但为什么呢?
- pandas - 如何从 pandas.DataFrame.describe() 中提取最高值?
- python - 如何在tensorflow中多次运行模型?
- http - 从 http 站点提取音频流(在线广播)
- html - 根据容器宽度减小标签文本大小
- c++ - 为什么这个 stl 函数调用会导致不正确的布尔评估?