1

行ごとに結合する必要がある 2 つのソース ファイルがあります。ファイルを変数に読み込んで満足しています。ロジックには満足していますが、構文に困惑しています。ファイル 1 の各行に対して、ファイル 2 の各行をループ処理し、連結された 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>

必要な出力:

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

XSLT を機能させるための私の (貧弱な) 試み:

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

(これらのファイルは、私が実際に持っているものを簡略化したものです)

1 つのテンプレートを 1 つの「行」値に一致させ、もう 1 つのテンプレートを別の値に一致させるにはどうすればよいですか (両方のソース ファイルが同じ構造を使用します)。そして、これらの「???」をどのように設定しますか 値?

4

1 に答える 1

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>

この変換が提供された最初の XML ドキュメントに適用されると、次のようになります。

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

必要な正しい結果が生成されます。

<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>
于 2012-05-17T16:03:14.433 に答える