无界 XML 元素到名称/值对,而不在 XSLT 中重复元素名称 [英] Unbounded XML Element to name/value pairs without repeating Element names in XSLT
本文介绍了无界 XML 元素到名称/值对,而不在 XSLT 中重复元素名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我编写了一个 xslt 来将输入的 xml 文件转换为名称/值对.
I have written an xslt to convert an input xml file to name/value pairs.
输入的xml如下:
INPUT.xml
<?xml version="1.0" encoding="UTF-8" ?>
<EMailData>
<PersonInfo>
<PersonID>PersonID1092</PersonID>
<EmailAddress>EmailAddress1093</EmailAddress>
<SecureToken>SecureToken1094</SecureToken>
<ContactPrimaryChannel>ContactPrimaryChannel1172</ContactPrimaryChannel>
<Order>
<OrderID>OrderID1224</OrderID>
<CustomerOrderNumber>CustomerOrderNumber1225</CustomerOrderNumber>
<OrderType/>
<Currency>Currency1226</Currency>
<OrderName/>
<OrderFrequency>OrderFrequency1227</OrderFrequency>
<IsRepeatDeliveryOrder>IsRepeatDeliveryOrder1228</IsRepeatDeliveryOrder>
<ProjectedShipmentDate>2015-02-05</ProjectedShipmentDate>
<NextShipmentDate>2015-02-05</NextShipmentDate>
<Total>1229</Total>
</Order>
<Order>
<OrderID>OrderID1259</OrderID>
<CustomerOrderNumber>CustomerOrderNumber1260</CustomerOrderNumber>
<OrderType/>
<Currency>Currency1261</Currency>
<OrderName/>
<OrderFrequency>OrderFrequency1262</OrderFrequency>
<IsRepeatDeliveryOrder>IsRepeatDeliveryOrder1263</IsRepeatDeliveryOrder>
<ProjectedShipmentDate>2015-02-05</ProjectedShipmentDate>
<NextShipmentDate>2015-02-05</NextShipmentDate>
<Total>1264</Total>
</Order>
</PersonInfo>
</EMailData>
我想要这样的输出:
Desired_OUTPUT.XML
<?xml version="1.0" encoding="UTF-8"?>
<EMailData>
<property name="EVENTINFO">
<property name="PersonInfo">
------
values
------
<property name="Order">
<row>
----
values
----
</row>
<row> <!-- Only Row Value Repeated For More than One Order -->
----
values
----
</row>
</property>
</property>
</property>
这是我使用的 XSLT.
This is the XSLT I used.
XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="EMailData/PersonInfo">
<property name="EVENTINFO">
<property name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</property>
</property>
</xsl:template>
<xsl:template match="EMailData/PersonInfo/*">
<property name="{local-name()}">
<value>
<xsl:apply-templates />
</value>
</property>
</xsl:template>
<!-- Order begins -->
<xsl:template match="EMailData/PersonInfo/Order">
<property name="{local-name()}">
<row>
<xsl:apply-templates select="@*|node()"/>
</row>
</property>
</xsl:template>
<xsl:template match="EMailData/PersonInfo/Order/*">
<property name="{local-name()}">
<value>
<xsl:apply-templates />
</value>
</property>
</xsl:template>
<!-- Order Ends -->
</xsl:stylesheet>
应用此 xslt 后,我得到的输出为:
After Applying this xslt I am Getting the output as:
<?xml version="1.0" encoding="UTF-8"?>
<EMailData>
<property name="EVENTINFO">
<property name="PersonInfo">
------
values
------
<property name="Order">
<row>
----
values
----
</row>
</property>
<property name="Order"> <!-- The Order Name is repeated -->
<row>
----
values
----
</row>
</property>
</property>
</property>
</EMailData>
请告诉我应该在哪里更改 XSLT.提前致谢!
Please Tell me Where I should Change my XSLT. Thanks in advance!
推荐答案
可惜你只给我们展示了部分输出;这使得很难理解这里的问题究竟是什么.在我看来,只做就足够了:
It's too bad you only show us a partial output; it makes it difficult to understand what exactly is the problem here. It seem to me that it should be quite sufficient to do only:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="PersonInfo">
<property name="EVENTINFO">
<property name="PersonInfo">
<xsl:apply-templates select="@*|node()[not(self::Order)]"/>
<property name="Order">
<xsl:apply-templates select="Order"/>
</property>
</property>
</property>
</xsl:template>
<xsl:template match="Order">
<row>
<xsl:apply-templates />
</row>
</xsl:template>
</xsl:stylesheet>
应用于您的示例输入,结果是:
Applied to your example input, the result is:
<?xml version="1.0" encoding="UTF-8"?>
<EMailData>
<property name="EVENTINFO">
<property name="PersonInfo">
<PersonID>PersonID1092</PersonID>
<EmailAddress>EmailAddress1093</EmailAddress>
<SecureToken>SecureToken1094</SecureToken>
<ContactPrimaryChannel>ContactPrimaryChannel1172</ContactPrimaryChannel>
<property name="Order">
<row>
<OrderID>OrderID1224</OrderID>
<CustomerOrderNumber>CustomerOrderNumber1225</CustomerOrderNumber>
<OrderType/>
<Currency>Currency1226</Currency>
<OrderName/>
<OrderFrequency>OrderFrequency1227</OrderFrequency>
<IsRepeatDeliveryOrder>IsRepeatDeliveryOrder1228</IsRepeatDeliveryOrder>
<ProjectedShipmentDate>2015-02-05</ProjectedShipmentDate>
<NextShipmentDate>2015-02-05</NextShipmentDate>
<Total>1229</Total>
</row>
<row>
<OrderID>OrderID1259</OrderID>
<CustomerOrderNumber>CustomerOrderNumber1260</CustomerOrderNumber>
<OrderType/>
<Currency>Currency1261</Currency>
<OrderName/>
<OrderFrequency>OrderFrequency1262</OrderFrequency>
<IsRepeatDeliveryOrder>IsRepeatDeliveryOrder1263</IsRepeatDeliveryOrder>
<ProjectedShipmentDate>2015-02-05</ProjectedShipmentDate>
<NextShipmentDate>2015-02-05</NextShipmentDate>
<Total>1264</Total>
</row>
</property>
</property>
</property>
</EMailData>
这篇关于无界 XML 元素到名称/值对,而不在 XSLT 中重复元素名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文