2017-08-30 119 views
0

我想將file.xml解釋爲file.txt,這不是問題,但是當我嘗試在不同標籤中「採取」很多事情時。具有XSLT多標籤的XML

請看看我的file.xml:

<racine> 
     <balise1> 
       <info> 
         <Commercial>1000</Commercial> 
         <OrdId>42</OrdId> 
         <CustomerId>314159</CustomerId> 
       </info> 
     </balise1> 
     <balise2> 
       <info2> 
         <Quantity>1</Quantity> 
         <Price>10.0</Price> 
         <Currency>CHF</Currency> 
       </info2> 
     </balise2> 
</racine> 

我想這個輸出;

Commercial,Order,CustomerId,Quantity,Price,Currency 
1000,42,314159,1,10.0,CHF 

我嘗試了很多解決方案,但我是XSLT的noob。

這裏是我的XSLT的例子:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSl/Transform"> 
<xsl:output method="text" /> 

<xsl:template match="/"> 
<xsl:text>Commercial,OrdId,CustomerId,Quantity,Price,Currency</xsl:text> 
<xsl:text>&#xa;</xsl:text> 
<xsl:apply-templates select="racine"/>  
</xsl:template> 

<xsl:template match="racine"> 
<xsl:apply-templates select="balise1/info"/> 
</xsl:template> 

<xsl:template match="info"> 
    <xsl:value-of select="Commercial"/> 
    <xsl:text>,</xsl:text> 
    <xsl:value-of select="OrdId"/> 
    <xsl:text>,</xsl:text> 
    <xsl:value-of select="CustomerId"/> 
    <xsl:text>&#xa;</xsl:text> 
</xsl:template> 

<xsl:template match="info"> 
    <xsl:apply-templates select="balise2/info2"/> 
</xsl:template> 

<xsl:template match="info2"> 
<xsl:value-of select="ItemQuantity"/> 
<xsl:text>,</xsl:text> 
<xsl:value-of select="PriceValue"/> 
<xsl:text>,</xsl:text> 
<xsl:value-of select="CurrencyCode"/> 
<xsl:text>&#xa;</xsl:text> 
</xsl:template> 

</xsl:stylesheet> 
+2

能否請您添加所需的輸出和 - 如果你已經嘗試過一些東西 - 你當前的xslt。 – Filburt

+0

請閱讀[在什麼情況下,我可以添加「緊急」或其他類似的短語到我的問題,以獲得更快的答案?](/ meta.stackoverflow.com/q/326569) - 總結是,這不是這是解決志願者問題的理想方式,可能會對獲得答案產生反作用。請不要將這添加到您的問題。 – halfer

+0

https://www.collinsdictionary.com/dictionary/french-english/balise – halfer

回答

2

你有兩個模板匹配這是在XSLT認爲是一個錯誤"info"。從看你需要什麼,第二個模板的身體或許應該從匹配racine

<xsl:template match="racine"> 
    <xsl:apply-templates select="balise1/info"/> 
    <xsl:apply-templates select="balise2/info2"/> 
</xsl:template> 

其他的事情模板稱爲注意

  1. 命名空間是區分大小寫的。您已將xsl名稱空間指定爲http://www.w3.org/1999/XSl/Transform,當它應該是http://www.w3.org/1999/XSL/Transform
  2. 您的info2模板指的是XML中不存在的元素。

試試這個XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" /> 

<xsl:template match="/"> 
    <xsl:text>Commercial,OrdId,CustomerId,Quantity,Price,Currency</xsl:text> 
    <xsl:text>&#xa;</xsl:text> 
    <xsl:apply-templates select="racine"/>  
</xsl:template> 

<xsl:template match="racine"> 
    <xsl:apply-templates select="balise1/info"/> 
    <xsl:apply-templates select="balise2/info2"/> 
    <xsl:text>&#xa;</xsl:text> 
</xsl:template> 

<xsl:template match="info"> 
    <xsl:value-of select="Commercial"/> 
    <xsl:text>,</xsl:text> 
    <xsl:value-of select="OrdId"/> 
    <xsl:text>,</xsl:text> 
    <xsl:value-of select="CustomerId"/> 
</xsl:template> 

<xsl:template match="info2"> 
    <xsl:text>,</xsl:text> 
    <xsl:value-of select="Quantity"/> 
    <xsl:text>,</xsl:text> 
    <xsl:value-of select="Price"/> 
    <xsl:text>,</xsl:text> 
    <xsl:value-of select="Currency"/> 
</xsl:template> 

</xsl:stylesheet> 
+0

謝謝,它的工作! ;) –

-1
Check this code 

<xsl:template match="/"> 
<xsl:text>Commercial,OrdId,CustomerId,Quantity,Price,Currency</xsl:text> 
<xsl:text>&#xa;</xsl:text> 
<xsl:apply-templates select="racine"/>  
</xsl:template> 

<xsl:template match="info"> 
<xsl:value-of select="Commercial"/> 
<xsl:text>,</xsl:text> 
<xsl:value-of select="OrdId"/> 
<xsl:text>,</xsl:text> 
<xsl:value-of select="CustomerId"/> 
</xsl:template> 

<xsl:template match="info2"> 
<xsl:value-of select="Quantity"/> 
<xsl:text>,</xsl:text> 
<xsl:value-of select="Price"/> 
<xsl:text>,</xsl:text> 
<xsl:value-of select="Currency"/> 
<xsl:text>&#xa;</xsl:text> 
</xsl:template> 
1

如果輸入有固定的格式,比你可以在XSLT輕鬆地處理這2.0

<xsl:template match="/"> 
    <xsl:text>Commercial,OrdId,CustomerId,Quantity,Price,Currency</xsl:text> 
    <xsl:text>&#xa;</xsl:text> 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="racine"> 
    <xsl:value-of select="balise1/info/*|balise2/info2/*" separator=","/> 
    <xsl:text>&#xa;</xsl:text> 
</xsl:template> 
+0

不能使用XSLT2.0必須爲1.0 –