我正在学习xslt。如果我从 XML 文件中删除所有前缀"oz:",我会得到预期的输出。请让我知道如何解决它。
另外,请让我知道元素"规范"中"描述符"和"类型"的逻辑
预期的 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
</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>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
将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
</xsl:text>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="oz:categ">
<xsl:value-of select="concat(
'"',oz:item,'",',
'"',oz:desc,'",',
'"',oz:Spec/@oz:Descriptor,'",',
'"',oz:origin,'"
')"/>
</xsl:template>
</xsl:stylesheet>