2011-08-02 5 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> 

이제 내 머리에이 작업을해야하지만, 일치하지 않는 태그 때문에 오류가 발생합니다. 하지만 두 블록의 데이터를 한 블록 내에 배치해야하고 어떻게이 일을 성취 할 수 있는지 잘 모르겠습니다.

감사합니다. 제임스.

편집 :

나는이 달성하기 위해 노력하고있어 : 내가 외부 <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>의 몸 전체에 잘보세요 : 당신은 실제로 그들이 이제까지 출력의 단일 set 요소로 결합되지 의미 이런 식으로, 일을 독립적으로 모두 item 요소를 치료하고

<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, 제가 달성하려고 시도하고있는 것을 보여주기 위해 제 대답을 업데이트했습니다. 아마도 XML로는 가능하지 않습니다. – Cadab

+0

@ Flynn1179s 답변을 확인하십시오, 그걸 처리합니다. –

2

. 당신이 값은 항상 이름을 다음과 보장 할 수있는 경우에, 당신은이 작업을 수행 할 수 있습니다

<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> 
관련 문제