无界 XML 元素到名称/值对,而不在 XSLT 中重复元素名称 [英] Unbounded XML Element to name/value pairs without repeating Element names in XSLT

查看:25
本文介绍了无界 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆