我正在尝试将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>
答案 0 :(得分:2)
您实际上是以这种方式单独处理两个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>
答案 1 :(得分:2)
这可以通过非常简单的方式完成:
<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>
答案 2 :(得分:1)
此处缺少</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>