2012-05-17 4 views
1

행 기반으로 결합해야하는 두 개의 소스 파일이 있습니다. 나는 변수로 파일을 읽는 것이 행복하고 논리는 만족 스럽지만 문법은 나를 곤경에 빠뜨린다. 파일 1의 각 행에 대해 I는 두 변수가 함께 연결된 파일 (2)과 출력의 각 행 둥근 루프해야두 개의 개별 소스 파일에서 각 행의 데이터를 병합하고 연결하려면 어떻게합니까?

파일 1

<rows> 
    <row>1</row> 
    <row>2</row> 
    <row>3</row> 
    <row>4</row> 
</rows> 

파일 2

<rows> 
    <row>a</row> 
    <row>b</row> 
</rows> 

필요한 출력을 다음 XSLT를 받고에서

<rows> 
    <row>1/a</row> 
    <row>1/b</row> 
    <row>2/a</row> 
    <row>2/b</row> 
    <row>3/a</row> 
    <row>3/b</row> 
    <row>4/a</row> 
    <row>4/b</row> 
<rows> 

내 (가난한) 시도가 작동합니다 :

<rows> 
    <xsl:apply-templates select="document('file1.xml')/rows/row" /> 
</rows> 

<xsl:template match="row"> 
    <xsl:apply-templates select="document('file2.xml')/rows/row" /> 
</xsl:template> 

<xsl:template match="row"> 
    <row><xsl:value-of select="???" />/<xsl:value-of select="???" /></row> 
</xsl:template> 

(이 파일은 실제로 무슨의 단순화 된 버전입니다)

어떻게 하나의 템플릿 매치 한 '행'값과 다른 다른 경기 (모두 원본 파일이 같은 구조를 사용) 다하겠습니다. 그리고 어떻게 그 '???' 가치? 원하는 정확한 결과가 생성됩니다

<rows> 
    <row>1</row> 
    <row>2</row> 
    <row>3</row> 
    <row>4</row> 
</rows> 

:이 변환이 제공된 첫 번째 XML 문서에 적용되는

답변

1
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:variable name="vDoc2"> 
    <rows> 
     <row>a</row> 
     <row>b</row> 
    </rows> 
</xsl:variable> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="/*"> 
    <rows> 
    <xsl:apply-templates/> 
    </rows> 
</xsl:template> 

<xsl:template match="row"> 
    <xsl:apply-templates select="$vDoc2/*/row" mode="doc2"> 
    <xsl:with-param name="pValue" select="."/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="row" mode="doc2"> 
    <xsl:param name="pValue" /> 

    <row><xsl:sequence select="concat($pValue, '/', .)"/></row> 
</xsl:template> 
</xsl:stylesheet> 

마법처럼

<rows> 
    <row>1/a</row> 
    <row>1/b</row> 
    <row>2/a</row> 
    <row>2/b</row> 
    <row>3/a</row> 
    <row>3/b</row> 
    <row>4/a</row> 
    <row>4/b</row> 
</rows> 
+0

작품, 감사 –

+0

@ TheArtfulBenny : 천만에. –

+0

어떻게 작동하는지 알고 있습니다.이 섹션의 기능에 대해 설명해 주시겠습니까? ... ' –