2011-05-11 2 views
1

buyeritemcode = substring (field [@ id = '0'], 11,3) 다음 lookf table에서 subfamily = 서브 패밀리가 있으면 결과를 가져 오는이 테이블의 lookup 테이블이 있습니다.Altova 및 cooktop의 다른 결과

<lookup> 
    <Code> 
     <BuyerItemCode>439</BuyerItemCode> 
     <Subfamily>016</Subfamily>   
    </Code> 
</lookup> 

XML 파일은 같습니다

<document> 
    <line id="14"> 
     <field id="0"><![CDATA[MMM4443 419280600000]]></field> 
    </line> 
    <line id="15"> 
     <field id="0"><![CDATA[MMM4443 414390600000]]></field> 
    </line> 
</document> 

내가 lookup.xml와이 데이터를 비교해야하고 데이터가 비교되지 않을 경우 내 프로그램이 작동 altova의 V11과 함께 일정 (9)를 삽입 렌지하지 않는으로, 나는 비교가 거짓이라는 뜻입니다. 내 프로그램은 같습니다

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://exslt.org/dates-and-times" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="date exsl"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:key name="ProdSubfamily" match="Subfamily" use="../BuyerItemCode"/> 
    <xsl:template match="/"> 
     <Interchange> 
      <Group> 
       <Message> 
        <xsl:if test="/document/line[(substring(field[@id='0'], 1,3)='MMM')]"> 
         <xsl:apply-templates mode="MMM" select="/document"/> 
        </xsl:if> 
       </Message> 
      </Group> 
     </Interchange> 
    </xsl:template> 
    <xsl:template mode="MMM" match="/document"> 
     <PriceCatalogue-Lines> 
      <xsl:for-each select="/document/line[contains(substring(field[@id='0'], 1,3),'MMM') and not(contains(substring(field[@id='0'],9,1),'0'))]"> 
       <xsl:variable name="inputProd" select="substring(field[@id='0'], 11,3)"/> 
       <Line> 
        <Line-Item> 
         <LineNumber> 
          <xsl:value-of select="position()"/> 
         </LineNumber> 
         <BuyerItemCode> 
          <xsl:value-of select="substring(field[@id='0'], 11,3)"/> 
         </BuyerItemCode> 
         <SubFamily> 
          <xsl:choose> 
           <xsl:when test="substring(field[@id='0'], 11,3) = document('lookup.xml')/*/*/BuyerItemCode"> 
            <xsl:for-each select="document('lookup.xml')"> 
             <xsl:for-each select="key('ProdSubfamily',$inputProd)"> 
              <xsl:value-of select="."/> 
             </xsl:for-each> 
            </xsl:for-each> 
           </xsl:when> 
           <xsl:otherwise> 
            <xsl:value-of select="'9'"/> 
           </xsl:otherwise> 
          </xsl:choose> 
         </SubFamily> 
        </Line-Item> 
       </Line> 
      </xsl:for-each> 
     </PriceCatalogue-Lines> 
    </xsl:template> 
</xsl:stylesheet> 
내가 Altova으로 얻을 내가 쿡탑이 결과를 얻을 것이다 할

올바른 결과 :

<Interchange> 
    <Group> 
     <Message> 
      <PriceCatalogue-Lines> 
       <Line> 
        <Line-Item> 
         <LineNumber>1</LineNumber> 
         <BuyerItemCode>928</BuyerItemCode> 
         <SubFamily>9</SubFamily> 
        </Line-Item> 
       </Line> 
       <Line> 
        <Line-Item> 
         <LineNumber>2</LineNumber> 
         <BuyerItemCode>439</BuyerItemCode> 
         <SubFamily>016</SubFamily> 
        </Line-Item> 
       </Line> 
      </PriceCatalogue-Lines> 
     </Message> 
    </Group> 
</Interchange> 
내가 윗판로 얻을

BAD 결과 :

<Interchange> 
<Group> 
<Message> 
<PriceCatalogue-Lines> 
<Line> 
<Line-Item> 
<LineNumber>1</LineNumber> 
<BuyerItemCode>928</BuyerItemCode> 
<SubFamily>9</SubFamily> 
</Line-Item> 
</Line> 
<Line> 
<Line-Item> 
<LineNumber>2</LineNumber> 
<BuyerItemCode>439</BuyerItemCode> 
<SubFamily>9</SubFamily> 
</Line-Item> 
</Line> 
</PriceCatalogue-Lines> 
</Message> 
</Group> 
</Interchange> 
+1

쿡탑의 출력은 무엇입니까? 비어있는 ''요소? – LarsH

+0

좋은 질문입니다. +1. 문제의 설명과 쉬운 해결책을 위해 내 대답을 참조하십시오. :) –

+0

@LarsH : cooktop에 서브 패밀리 = 9 – Petras

답변

1

문제는 소스 XML 문서에 있습니다. :

CDATA 섹션에 불필요한 [ 문자가 포함되어 있으며 텍스트 노드의 첫 번째 문자입니다.

교체 :

<field id="0"><![CDATA[[MMM4443 419280600000]]></field> 

과 :

,536

substring(field[@id='0'], 1,3)='MMM' 

false()

항상 해결입니다 : 이것은 것을 의미한다

<field id="0"><![CDATA[MMM4443 419280600000]]></field> 

또한 교체 :

<field id="0"><![CDATA[[MMM4443 414390600000]]></field> 

이제

<field id="0"><![CDATA[MMM4443 414390600000]]></field> 

와 관계없이 사용되는 XSLT 프로세서 (집에서 그 중 9을 가지고에이를 실행할 수 MSXML3/4, .NET XslCompiledTransform 및 XslTransform, AltovaXML, Saxon 6.5.4, Saxon 9.1.05 및 XQSharp)의 변환 결과는 다음과 같습니다. 난 당신이을 원하는 추측 무엇 :

<Interchange> 
    <Group> 
    <Message> 
     <PriceCatalogue-Lines> 
     <Line> 
      <Line-Item> 
      <LineNumber>1</LineNumber> 
      <BuyerItemCode>928</BuyerItemCode> 
      <SubFamily>9</SubFamily> 
      </Line-Item> 
     </Line> 
     <Line> 
      <Line-Item> 
      <LineNumber>2</LineNumber> 
      <BuyerItemCode>439</BuyerItemCode> 
      <SubFamily>016</SubFamily> 
      </Line-Item> 
     </Line> 
     </PriceCatalogue-Lines> 
    </Message> 
    </Group> 
</Interchange> 

내 생각은 윗판의 XSLT 프로세서를 위해 몇 가지 구성을 필요로 document() 기능을 실행하는 데 사용할 수 있다는 것입니다 -이 작업을 수행하는 방법을 사용할 수있는 문서를 공부합니다.

+0

@Dimitre Novatchev : xml file 수리를하고 싶습니다. 문서의 줄을 여기에 쓸 때 실수가 있었음을 의미합니다. 필요하면 "["를 더합니다. 아직 작동하지 않는 프로그램. 당신의 대답에 나는 잘못된 결과를 보았습니다. 두 번째 줄에서 BuyerItemCode = 439인데 subfamily는 조회 테이블에서 가져와야합니다. 016은 이제 9와 같습니다. 쿡탑으로도이 결과가 있습니다. – Petras

+0

@Petras : 질문을 편집하고 " 작동하지 않음 "- 얻는 결과는 무엇이며 제작하고자하는 결과는 무엇입니까? –

+0

+1, 특히 "집에 9 명이 있습니다." :-) – LarsH

0

Petras, 출력은 XSLT 프로세서가 lookup.xml 파일을 찾을 수 없음을 의미합니다.

상대 URL ('조회.xml '), 기본 URL이 무엇인지 알고 있습니까? 다른 말로 표현하자면, 무엇과 관련이 있는가?

기본적으로 사용되는 기본 URL은 스타일 시트의 기본 URL로 생각됩니다. document()에 두 번째 인수를 전달하면 명시 적으로 기본 URL을 설정할 수 있습니다. 예 :

document('lookup.xml', /) 

은 입력 XML 파일을 기준으로 'lookup.xml'을 찾습니다.

'lookup.xml'의 절대 URL을 제공하여 문제를 해결하거나 적어도 인 경우 문제를 해결할 수 있습니다. 시도해 보시고 효과가 있는지 알려주십시오. 예 :

document('/home/lars/lookup.xml') 

또는

document('file:///c:/temp/lookup.xml') 

P.S. XML 쿡탑 (XML Cooktop)은 훌륭한 소프트웨어 였지만 오히려 오래되어 현재는 유지 보수가되지 않은 것으로 보인다. 이는 글리치가 나타날 때 문제가됩니다. OxygenXML 또는 StylusStudio와 같은 다른 XSLT 도구를 계속 사용해 볼 수도 있습니다.

+0

@LarsH : 나는 당신의 게시물에서 addres 링크와 다른 예제를 사용하려고합니다. 하지만 작동하지 않는 결과는 동일한 첫 번째 및 두 번째 subfamily = 9입니다. 또한 조건을 변경하려고합니다. '='use '! ='대신 (의미 : 결과는 첫 번째 하위 게시자가되었습니다 ([@ id = '0'], 11,3) = 비어있는, 두 번째 = 016. 그래서 나는 조건과 함께 무엇인가 틀리게 생각하고있다. – Petras

+0

@LarsH : 내 모든 프로그램, 내가 사용하는 데이터 및 altova 및 cooktop에 대한 두 가지 결과를 내 질문에 보여주었습니다. 내가 그것을 풀면 나는 그것을 어떻게 풀고이 사건을 마무리하는지 보여준다. – Petras

+0

@Petras, 절대 URL을 보여 주셔서 감사합니다. 백 슬래시를 슬래시 **로 변경해야 할 수 있습니다 **. 그래서 당신이 시도한 것을 정확히 보여달라고 요청한 것입니다. 그렇지 않으면 백 슬래시를 사용했다는 것을 알 수있는 방법이 없었을 것입니다. – LarsH