带有XSLT多标记的XML

时间:2017-08-30 08:41:50

标签: xml csv xslt

我想将file.xml解释为file.txt,这不是问题,但是当我尝试"采取"不同标签中的很多东西。

请查看我的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中是一个菜鸟。

以下是我的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>

3 个答案:

答案 0 :(得分:2)

您有两个匹配"info"的模板,这在XSLT中被视为错误。通过查看您的需求,可能应该从匹配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 <{1}}
  2. 您的http://www.w3.org/1999/XSL/Transform模板指的是XML中不存在的元素。
  3. 试试这个XSLT

    info2

答案 1 :(得分: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>

答案 2 :(得分:-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>