在XSL中使用多个XML文件并注入源名称

时间:2014-03-14 18:17:59

标签: xml xslt ant

假设我在多个XML文件中具有以下相同的数据结构......

<project>
  <property name="A" value="a"/>
  <property name="B" value="b"/>
</project>

和那些我无法修改的文件(ant文件)。约束#1。

我还有一个引用这些文件的XML文件......

<files>
  <file name="file1.xml"/>
  <file name="file2.xml"/>
  <file name="file3.xml"/>
</files>

我需要一个XSL示例,它不仅会合并文件,还会注入源名称并允许查询类似于...

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="text"/>
  <xsl:template match="/project">
    <xsl:for-each select="property[contains(@name,'doxy')]">
      <xsl:sort select="./@name"/>
      <xsl:value-of select="./@name"/>
      <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
  </xsl:template>
</xsl:transform>

...这会给我一个简单的名称文本列表,但我也想知道数据来自哪个文件...

PROPERTYNAME |的资源文件

所以我的输出看起来像是:

A|file1.xml
B|file1.xml
C|file2.xml
D|file3.xml

我是XSL的新手,我在SO上发现的描述如何组合XML数据的帖子没有说明如何注入这种源文件信息。 考虑到我的约束,这可以在一个步骤(没有写入)中完成吗? 我正在使用Saxon HE XSLT处理器。

1 个答案:

答案 0 :(得分:2)

使用列出其他文件的文件作为XSLT的主要输入,然后使用

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="text"/>
  <xsl:template match="/">
    <xsl:apply-templates select="document(files/file/@name)/*"/>
  </xsl:template>
  <xsl:template match="/project">
    <xsl:for-each select="property[contains(@name,'doxy')]">
      <xsl:sort select="./@name"/>
      <xsl:value-of select="concat(@name, '|', tokenize(document-uri(/), '/')[last()])"/>
      <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
  </xsl:template>
</xsl:transform>