我正在尝试使用XLST与此XML:
<?xml version="1.0"?>
<ArrayOfDynamicData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<DynamicData>
<item>
<name>Name</name>
<value xsi:type="xsd:int">0</value>
</item>
<item>
<name>Value</name>
<value xsi:type="xsd:long">1</value>
</item>
</DynamicData>
</ArrayOfDynamicData>
我现在的XLST是:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:xdt="http://www.w3.org/2005/xpath-datatypes"
xmlns:err="http://www.w3.org/2005/xqt-errors"
exclude-result-prefixes="xs xdt err fn">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<graph showNames='1' caption='##TITLE HERE##' decimalPrecision='0' >
<xsl:for-each select="ArrayOfDynamicData/DynamicData/item">
<xsl:if test="name='Name'">
<set>
<name><xsl:value-of select='value' /></name>
</xsl:if>
<xsl:if test="name='Value'">
<value><xsl:value-of select='value' /></value>
</set>
</xsl:if>
</xsl:for-each>
</graph>
</xsl:template>
</xsl:stylesheet>
现在在我的头这应该工作,但我得到一个错误,由于不匹配的标签。但我需要从两个块的数据放在一个块内,我不知道我怎么能做到这一点。
谢谢,詹姆斯。
编辑:我正在努力实现这个:
<set>
<name>0</name>
<value>2</value>
</set>
如果我把<set>
标签放在If之外,我得到:
<set>
<name>0</name>
</set>
<set>
<value>2</value>
</set>
这可以通过一种非常简单的方式完成:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" method="xml" indent="yes"/>
<xsl:template match="/">
<graph showNames='1' caption='##TITLE HERE##' decimalPrecision='0'>
<set>
<xsl:for-each select=
"ArrayOfDynamicData/DynamicData/item[name='Name']">
<name>
<xsl:value-of select='value' />
</name>
<value>
<xsl:value-of select=
"following-sibling::item[name = 'Value'][1]/value" />
</value>
</xsl:for-each>
</set>
</graph>
</xsl:template>
</xsl:stylesheet>
当应用于提供的XML文档时:
<ArrayOfDynamicData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<DynamicData>
<item>
<name>Name</name>
<value xsi:type="xsd:int">0</value>
</item>
<item>
<name>Value</name>
<value xsi:type="xsd:long">1</value>
</item>
</DynamicData>
</ArrayOfDynamicData>
生成所需的正确结果:
<graph showNames="1" caption="##TITLE HERE##" decimalPrecision="0">
<set>
<name>0</name>
<value>1</value>
</set>
</graph>
您实际上以这种方式独立处理两个item
元素,这意味着它们永远不会在输出中组合成单个set
元素。如果你能保证一个值总是跟在一个名字后面,那么你可以这样做:
<xsl:for-each select="ArrayOfDynamicData/DynamicData/item[name='Name']">
<set>
<name><xsl:value-of select="value" /></name>
<value><xsl:value-of select="following-sibling::item[1]/value"></value>
</set>
</xsl:for-each>
这里缺少一个</xsl:if>
:
<xsl:if test="name='Value'">
<value><xsl:value-of select='value' /></value>
</set>
编辑
仔细检查,<set>
标签从结构中脱落。仔细看一下整个<xsl:for-each>
:
<xsl:if test="name='Name'">
<set> <!-- Start tag here. -->
<name><xsl:value-of select='value' /></name>
<!-- no end tag -->
</xsl:if>
<xsl:if test="name='Value'">
<!-- No set start tag -->
<value><xsl:value-of select='value' /></value>
</set> <!-- End tag here -->
</xsl:if>