1

我有两个源文件,我需要逐行组合它们。我很高兴将文件读入一个变量,我对逻辑很满意,但语法让我很难过。对于文件 1 中的每一行,我需要循环遍历文件 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>

(这些文件是我实际拥有的文件的简化版本)

如何使一个模板匹配一个“行”值而另一个匹配另一个(两个源文件使用相同的结构)。我该如何设置那些'???' 价值观?

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