2016-09-16 1 views
0

기본적으로 여기서 시도하는 것은 XSLT를 사용하여 참조 XML의 요소 값으로 여러 XML을 병합하고 정렬하는 것입니다.여러 XML을 다른 XML의 요소 값으로 정렬

> <xsl:variable name="refXml" 
> select="document(concat(replace($refXmlTemp,'^file:',''),'/ref.xml'))"/> 
> 
> 

> <xsl:for-each select="for $x in 
> collection(string-join(($inputDir,'select=*.xml;recurse=yes;on-error=fail'),'?')) 
> return 
>       (if (matches($refXml/root/descendant-or-self::issue/id[normalize-space(.)=normalize-space($x/art/item/id)]/number,'\w+') 
> and matches($x/art/item/title,'\w+')) then saxon:discard-document($x) 
>       else())"> 

> <xsl:sort select="$refXml/root/descendant-or-self::issue/id[normalize-space(.)=/art/item/id]/following-sibling::number"/> 

위의 스 니펫은 모든 입력 XML을 병합했지만 정렬되지 않았습니다.

XSLT xsl:sort 함수는 현재 처리중인 XML 내부의 값을 가리키는 경우에만 적용됩니다.

정렬에서 ref.xml을 참조로 사용할 수있는 방법에 대해 조언 해주십시오.

여기 ref.xml 샘플 입력이다 :

<root> 
<issue> 
    <id>wlu-101</id> 
    <number>1</number> 
</issue> 
<issue> 
    <id>wlu-143</id> 
    <number>2</number> 
</issue> 
<issue-group> 
    <issue> 
     <id>wlu-144</id> 
     <number>3</number> 
    </issue> 
    <issue-group> 
     <issue> 
     <id>wlu-185</id> 
     <number>4</number> 
     </issue> 
    </issue-group> 
</issue-group> 
</root> 

답변

1

대안으로서 사용 <xsl:sort select="$refXml//issue[normalize-space(id)=current()/art/item/id]/number"/>

<xsl:key name="ref" match="issue" use="normalize-space(id)"/> 

을 정의한 후

<xsl:sort select="key('ref', /art/item/id, $refXml)/number"/> 

<xsl:sort select="$refXml/root/descendant-or-self::issue/id[normalize-space(.)=/art/item/id]/following-sibling::number"/>으로 바꾸기.

+0

Martin 고맙습니다.하지만 내가 제안한 코드를 시도했을 때 예상대로 정렬되지 않았습니다. 마치 XML에 변경 사항이없는 것 같습니다. – Viin

+0

문제점을 정렬 된 순서로 처리하려는 입력 파일을 최소 3 ~ 4 개까지 줄이고 문제를 보여주기 위해 샘플을 최소화하여 표시 할 수 있습니까? 일이 실패한 XSLT 코드 스 니펫에서만 말할 수는 없지만 어떤 키 또는 경로가 잘못되었는지 확인하려면 샘플 데이터를 참조해야합니다. –

+0

woot! 첫 번째 시도에서 작동하지 않는 이유는 내 잘못 인 것 같습니다. 죄송합니다. 그러나 자손 또는 자손이 과 함께 작업 할 수 없었던 이유는 어떻게 number 값을 얻는 데 사용할 수 있습니까? 가능하겠습니까? – Viin