如何合并和连接两个单独源文件中每行的数据?

时间:2012-05-17 15:30:42

标签: xslt-2.0 saxon

我有两个源文件,我需要逐行组合。我很高兴将文件读入变量,我对逻辑感到满意,但语法让我感到难过。对于文件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>

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

如何使一个模板匹配一个'row'值而另一个匹配另一个(两个源文件使用相同的结构)。我该如何设置'???'值?

1 个答案:

答案 0 :(得分: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>