2011-08-02 43 views
2
私はこのXMLとXLSTを使用しようとしている

XSLT - 不一致タグ

<?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> 

今、私の頭の中で、これは動作するはずですが、不一致のタグが原因でエラーが発生します。しかし、私は2つのブロックから1つのブロック内に配置する必要があり、私はこれをどのように達成できるか分かりません。

ありがとう、 james。

編集:

私はこれを達成しようとしている:私は外<set>タグを入れた場合

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

をの場合、私が取得:

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

良い質問、+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ドキュメント:指名手配、正しい結果が01に製造され

<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

が行方不明</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> 
+0

こんにちはAnders、私は達成しようとしていることを示すために私の答えを更新しました。 – Cadab

+0

@ Flynn1179sの答えをチェックしてください、それはそれを処理します。 –

2

あなたが実際に彼らがこれまでの出力における単一set要素にまとめ得ることはありませんを意味し、独立して、このようにそれをやって、両方のitem要素を処理しています。あなたは値が常に名前に従うことを保証できる場合は、この操作を行うことができます。

<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>