使用XSLT将XML转换为csv

时间:2018-03-02 19:20:26

标签: xml xslt xslt-1.0

我正在学习xslt。如果我从XML文件中删除所有前缀“oz:”,我将得到预期的输出。请让我知道如何解决它。

另外,请让我知道元素“Spec”中“Descriptor”和“type”的逻辑

预期的csv输出:

Item,Desc,Type,Origin
"100","nuts","Metal","USA"
"125","bolts","",""
"125","screw","",""

实际输出:

Item,Desc,Type,Origin
100nutsMetalUSA125bolts125screw

XML:

<?xml version='1.0' encoding='UTF-8'?>
<oz:listing xmlns:oz="abc:com.listing/itemData">
    <oz:categ>
        <oz:item>100</oz:item1>
        <oz:desc>nuts</oz:desc>
        <oz:Spec oz:Descriptor="Metal">
                <oz:ID oz:type="Spec_Code">Metal</oz:ID>
        </oz:Spec>
        <oz:origin>USA</oz:origin>
    </oz:categ>
        <oz:categ>
        <oz:item>125</oz:item1>
           <oz:desc>bolts</oz:desc>
          </oz:categ>
    <oz:categ>
        <oz:item>125</oz:item1>
            <oz:desc>screw</oz:desc>
             <oz:origin>CAN</oz:origin>
           </oz:categ>
</oz:listing>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:strip-space elements="*" />

<xsl:template match="/">
        <xsl:text>Item,Desc,Type,Origin&#xD;</xsl:text>
        <xsl:apply-templates/>
  </xsl:template>
<xsl:template match="listing">
<xsl:for-each select="./categ">
"<xsl:value-of select="normalize-space(./item)"/>","<xsl:value-of select="normalize-space(./desc)"/>","<xsl:value-of select="normalize-space(./Spec)"/>","<xsl:value-of select="normalize-space(./origin)"/>"
<!-- Add a newline at the end of the record -->
    <xsl:text>&#xD;</xsl:text>
</xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

您需要将abc:com.listing/itemData命名空间绑定到XSLT中的前缀,并在xpath中使用它。

在下面的示例中,我将其绑定到oz前缀(就像输入XML一样),但我可以使用不同的前缀。只要它绑定到同一个uri(abc:com.listing/itemData)。

有关命名空间如何在XML中工作的更多信息,请参阅http://www.jclark.com/xml/xmlns.htm

示例...

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:oz="abc:com.listing/itemData">
  <xsl:output method="text" encoding="UTF-8"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
    <xsl:text>Item,Desc,Type,Origin&#xA;</xsl:text>
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="oz:categ">
    <xsl:value-of select="concat(
      '&quot;',oz:item,'&quot;,',
      '&quot;',oz:desc,'&quot;,',
      '&quot;',oz:Spec/@oz:Descriptor,'&quot;,',
      '&quot;',oz:origin,'&quot;&#xA;')"/>
  </xsl:template>

</xsl:stylesheet>