XSLT -标签不匹配



我正在尝试使用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>

相关内容

  • 没有找到相关文章

最新更新