xslt - XSLT 中相同 xml 标记上的多个值
问题描述
我正在尝试使用 XSLT 转换 XML 数据,但是当转换为另一种 XML 格式时,多个值被映射到 XSLT 中的相同 xml 标记上。下面是输入。
<?xml version='1.0' encoding='UTF-8'?>
<MESSAGES>
<COMMANDSTATUS ID="SHIPPED" DESCRIPTION="Goods Shipped">
<ORDER O_ID="0003694706_1" TRACKING_URL="http://wwwapps.UPS.com/WebTracking/track?track=yes&trackNums=1ZEW3567YW46706215">
<ORDER_LINE OL_ID="1" SKU="28547859" QUANTITY="1"/>
<ORDER_LINE OL_ID="3" SKU="28461473" QUANTITY="1"/>
</ORDER>
</COMMANDSTATUS>
<COMMANDSTATUS ID="SHIPPED" DESCRIPTION="Goods Shipped">
<ORDER O_ID="0003698153_1" TRACKING_URL="http://wwwapps.UPS.com/WebTracking/track?track=yes&trackNums=1ZEW3571YW13958113">
<ORDER_LINE OL_ID="1" SKU="28353647" QUANTITY="1"/>
<ORDER_LINE OL_ID="2" SKU="28635431" QUANTITY="1"/>
<ORDER_LINE OL_ID="3" SKU="28635399" QUANTITY="1"/>
<ORDER_LINE OL_ID="6" SKU="28223766" QUANTITY="1"/>
</ORDER>
</COMMANDSTATUS>
</MESSAGES>
下面是 XSLT 代码。
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<root>
<xsl:for-each-group
select="/MESSAGES/COMMANDSTATUS/ORDER"
group-by="/MESSAGES/COMMANDSTATUS/ORDER/@O_ID">
<orders>
<id>
<xsl:value-of select="current-grouping-key()" />
</id>
<xsl:for-each
select="current-group()[@O_ID = current-grouping-key()]">
<tracking_url>
<xsl:value-of select="@TRACKING_URL" />
</tracking_url>
</xsl:for-each>
<xsl:for-each
select="current-group()[@O_ID = current-grouping-key()]">
<lineItems>
<sku>
<xsl:value-of select="./ORDER_LINE/@SKU" />
</sku>
<quantity>
<xsl:value-of select="./ORDER_LINE/@QUANTITY" />
</quantity>
</lineItems>
</xsl:for-each>
</orders>
</xsl:for-each-group>
</root>
</xsl:template>
</xsl:stylesheet>
以下是收到的输出。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<orders>
<id>0003694706_1</id>
<tracking_url>http://wwwapps.UPS.com/WebTracking/track?track=yes&trackNums=1ZEW3567YW46706215</tracking_url>
<lineItems>
<sku>28547859 28461473</sku>
<quantity>1 1</quantity>
</lineItems>
</orders>
<orders>
<id>0003698153_1</id>
<tracking_url>http://wwwapps.UPS.com/WebTracking/track?track=yes&trackNums=1ZEW3571YW13958113</tracking_url>
<lineItems>
<sku>28353647 28635431 28635399 28223766</sku>
<quantity>1 1 1 1</quantity>
</lineItems>
</orders>
</root>
下面是预期的输出。
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<orders>
<id>0003694706_1</id>
<tracking_url>http://wwwapps.UPS.com/WebTracking/track?track=yes&trackNums=1ZEW3567YW46706215</tracking_url>
<lineItems>
<sku>28547859</sku>
<quantity>1</quantity>
</lineItems>
<lineItems>
<sku>28461473</sku>
<quantity>1</quantity>
</lineItems>
</orders>
<orders>
<id>0003698153_1</id>
<tracking_url>http://wwwapps.UPS.com/WebTracking/track?track=yes&trackNums=1ZEW3571YW13958113</tracking_url>
<lineItems>
<sku>28353647</sku>
<quantity>1</quantity>
</lineItems>
<lineItems>
<sku>28635431</sku>
<quantity>1</quantity>
</lineItems>
<lineItems>
<sku>28635399</sku>
<quantity>1</quantity>
</lineItems>
<lineItems>
<sku>28223766</sku>
<quantity>1</quantity>
</lineItems>
</orders>
<root>
谁能让我知道我在这里做错了什么。
解决方案
您的示例数据似乎已经分组,所以我不确定您是否需要分组,但如果是这样,我认为您想按照以下方式进行分组
<xsl:template match="/">
<root>
<xsl:for-each-group
select="/MESSAGES/COMMANDSTATUS/ORDER"
group-by="@O_ID">
<orders>
<id>
<xsl:value-of select="current-grouping-key()" />
</id>
<xsl:for-each
select="current-group()">
<tracking_url>
<xsl:value-of select="@TRACKING_URL" />
</tracking_url>
</xsl:for-each>
<xsl:for-each
select="current-group()/ORDER_LINE">
<lineItems>
<sku>
<xsl:value-of select="@SKU" />
</sku>
<quantity>
<xsl:value-of select="@QUANTITY" />
</quantity>
</lineItems>
</xsl:for-each>
</orders>
</xsl:for-each-group>
</root>
</xsl:template>
推荐阅读
- react-native - 当用户通过设备或浏览器在抽屉内容中的后退按钮返回时,前一个屏幕与当前屏幕一起弹出,react-navigation v5
- c++ - Qt,类之间的通信
- functional-programming - 状态单子/单子转换器如何在 do 表示法中脱糖?
- git - 尝试在 Mac Apple Silicon M1 芯片上卸载自制软件时出现小错误
- python - sympy 从根到达特定的多项式表达式
- discord - 如何在 discord.py 中为我的静音角色创建数据库?
- python - 如何将我的结果变成字符串列表?
- c++ - 将 8 个字节从数组转换为 64 位整数 C++ 的最佳方法
- php - 使用 lexik 将公共数据添加到 JWT 响应
- c - MPI 的糟糕性能