2015-02-08 240 views
-2

我寫了一個xslt來將輸入xml文件轉換爲名稱/值對。無界XML元素名稱/值對,而不重複XSLT中的元素名稱

輸入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。

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我得到的輸出作爲後:

<?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。提前致謝!

+0

HTTP:/ /stackoverflow.com/help/someone-answers – 2015-02-09 08:44:19

回答

1

這太糟糕了,你只能向我們展示部分輸出;這使得很難理解這裏的問題究竟是什麼。這在我看來,它應該是相當足夠只有做到:

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> 

應用到您的例子投入,結果是:

<?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>