有两个XML文档:cars.xml
:
<?xml version="1.0" encoding="UTF-8" ?>
<Cars>
<Car Make="Cadillac" Country="U.S.A.">
<Options>
<Airbag Price="100" />
<CruiseControl Price="200" />
<SeatBelts Price="300" />
</Options>
</Car>
<Car Make="Volvo" Country="Sweden">
<Options>
<Airbag Price="50" />
<SeatBelts Price="75" />
</Options>
</Car>
</Cars>
和options.xml
:
<?xml version="1.0" ?>
<Options>
<Option><Name>Airbag</Name></Option>
<Option><Name>CruiseControl</Name></Option>
<Option><Name>FalconWings</Name></Option>
</Options>
我意识到Options
中的cars.xml
元素应该像这样定义:
<Option Name="Airbag" Price="100" />
但是cars.xml
是来自外部源的输入文件。然而,我做可以控制options.xml
文件的格式。
我想创建一个包含cars.xml
中的汽车的.csv以及options.xml
中列出的选项的价格。
# Make,Country,Airbag,CruiseControl,FalconWings
Cadillac,U.S.A.,100,200,N/A
Volvo,Sweden,50,N/A,N/A
如何让样式表打印options.xml
中列出的选项,价格为cars.xml
(如果汽车没有选项,则为N / A)?
答案 0 :(得分:2)
我喜欢使用xsl:value-of
输出一行csv:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="text"/>
<xsl:param name="options-url" select="'options.xml'"/>
<xsl:variable name="options" select="doc($options-url)//Name"/>
<xsl:template match="/">
<xsl:value-of select="'Make', 'Country', $options" separator=","/>
<xsl:text> </xsl:text>
<xsl:apply-templates select="Cars/Car"/>
</xsl:template>
<xsl:template match="Car">
<xsl:value-of select="@*, for $o in $options return ((current()/Options/*[name() = $o]/@Price, 'N/A')[1])" separator=","/>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
我得到了
Make,Country,Airbag,CruiseControl,FalconWings
Cadillac,U.S.A.,100,200,N/A
Volvo,Sweden,50,N/A,N/A
答案 1 :(得分:1)
我会做像
这样的事情<xsl:variable name="options" select="doc('Options.xml')//Name" as="xs:string*"/>
<!-- header line -->
...
<xsl:value-of select="$options" separator="."/>
...
<xsl:for-each select="Cars/Car">
<xsl:variable name="car" select="."/>
<!-- detail line -->
...
<xsl:for-each select="$options">
<xsl:variable name="o" select="$car/Option/*[name()=current()]">
<xsl:choose>
<xsl:when test="exists($o)">
<xsl:value-of select="',(' || name($o) || '=)' || $o/@Price"/>
</xsl:when>
<xsl:otherwise>,N/A</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:for-each>
答案 2 :(得分:0)
根据迈克尔的建议,我最终得到了这个产生所需输出的样式表:
<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="text"/>
<xsl:variable name="options" select="doc('options.xml')//Name" as="xs:string*"/>
<xsl:template match="/">
<!-- header line -->
<xsl:text># Make,Country,</xsl:text>
<xsl:value-of select="$options" separator=","/>
<xsl:text>
</xsl:text> <!-- newline -->
<xsl:for-each select="Cars/Car">
<xsl:variable name="car" select="."/>
<!-- detail line -->
<xsl:value-of select="@Make"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="@Country"/>
<xsl:for-each select="$options" >
<xsl:variable name="o" select="$car/Options/*[name()=current()]"/>
<xsl:choose>
<xsl:when test="exists($o)">
<xsl:text>,</xsl:text>
<xsl:value-of select="$o/@Price"/>
</xsl:when>
<xsl:otherwise>,N/A</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
<xsl:text>
</xsl:text> <!-- newline -->
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>