XSLT - несоответствующие теги - PullRequest
2 голосов
/ 02 августа 2011

Я пытаюсь использовать 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>

Теперь у меня в голове это должно работать, но я получаю ошибку из-за несоответствия тегов. Но мне нужно, чтобы данные из двух блоков были помещены в один блок, и я не уверен, как мне этого добиться.

Спасибо, Джеймс.

Edit:

Я пытаюсь добиться этого:

<set>
  <name>0</name>
  <value>2</value>
</set>

Если я поставлю <set> теги вне if, я получу:

<set>
    <name>0</name>
</set>
<set>
    <value>2</value>
</set>

Ответы [ 3 ]

2 голосов
/ 02 августа 2011

Вы фактически обрабатываете оба элемента 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>
2 голосов
/ 02 августа 2011

Это можно сделать очень простым способом :

<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>
1 голос
/ 02 августа 2011

Здесь отсутствует </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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...