获取生成文档​​的名称和路径

时间:2014-10-11 20:47:41

标签: xml xslt xslt-2.0

我需要一些特定问题的帮助。也许有人可以帮助我。

所以我的源文件是一个XML文档。在我的xslt-stylesheet的帮助下,XML文件的某些元素用于创建新的输出文件(结果文档)。到目前为止,这是我的代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs"
xpath-default-namespace="http://www.tei-c.org/ns/1.0" version="2.0" >
<xsl:strip-space elements="*"/>


<xsl:output indent="yes"
    doctype-public="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" method="xml"/>



<xsl:template match="name1">

    <xsl:variable name="name" select="concat('aus/',@xml:id,'/',@xml:id)"/>


            <xsl:result-document href="{$name}.collectione" indent="yes">

                        <element>

                                <xsl:attribute name="attributeName" select="???"/>
                                </xsl:element>
                        </element>
                        <xsl:apply-templates/>


            </xsl:result-document>

            <xsl:result-document href="{$name}.collectione.meta" indent="yes">
            </xsl:result-document>

            <xsl:apply-templates/>

(...)

现在创建了文件我希望显示所有创建文件的列表,这些文件是“element”的“attributeName”值,包括2个以前的父文件夹。它应该是这样的:

<element attributeName="../aus/tg1/tg1.collectione"/>
    <element attributeName="../aus/tg1/tg1.collectione.meta"/>
    <element attributeName="../aus/tg2/tg2.collectione"/>

任何人都可以帮助我吗?

PS:有没有办法显示某些文件夹中的文件?

修改

感谢您的帮助。

托尼,这似乎有效。但它只会显示“.collectione”。我想显示所有创建的文档(大约300个)。它们有不同的名称,如“.collectione”,“blabla.aggregation”,“bla.aggration.item”等。

这些文件也在不同的文件夹中,例如:

aus/collectione
aus/collectione.meta
aus/te1/te1.aggregation
aus/te1/te1.aggregation.meta
aus/te2/te2.edition
aus/te2/te2.edition.meta
aus/te2/te2.work
(...)

我想要的基本上是一个结果文档中的列表,它产生类似的东西:

<element attributeName="aus/collectione"/>
<element attributeName="aus/collectione.meta"/>
<element attributeName="aus/te1/te1.aggregatione"/>
<element attributeName="aus/te1/te1.aggregatione.meta"/>
<element attributeName="aus/te2/te2.editione"/>
<element attributeName="aus/te2/te2.editione.meta"/>

(依此类推)

一个Xpath表达式应该捕获a)所有文档和b)另一个xpatch表达式应该捕获特定文件夹的所有文档。

让我们说,当我打开文件“te1.aggregatione”时,我想看到所有用te1文件夹写的文件:

<element attributeName="aus/te1/te1.aggregatione"/>
<element attributeName="aus/te1/te1.aggregatione.meta"/> 

但是,当我打开收集文件时,我想要一个包含所有文件的列表(大约300个)。

我希望这次能清楚地表达自己o /

3 个答案:

答案 0 :(得分:0)

你应该可以做这样的事情......

<xsl:attribute name="attributeName" select="concat($name, '.collectione')"/>

或者可以创建一个新变量,在两个不同的地方使用

<xsl:variable name="name" select="concat('aus/',@xml:id,'/',@xml:id)"/>
<xsl:variable name="fullname" select="concat($name, '.collectione')"/>
<xsl:result-document href="{$fullname}" indent="yes">
    <element>
       <xsl:attribute name="attributeName" select="$fullname"/>

或者更好的是,使用属性值模板而不是xsl:attribute

 <element attributeName="{$fullname}"/>

答案 1 :(得分:0)

以不同的模式(http://www.w3.org/TR/xslt20/#modes)再次处理来源,例如:

<xsl:template match="/">
  <xsl:apply-templates />
  <list>
    <xsl:apply-templates mode="list" />
  </list>
</xsl:apply-templates>

<xsl:template match="name1" mode="list">
  <element attributeName="aus/{@xml:id}/{@xml:id}.collectione" />
  <element attributeName="../aus/{@xml:id}/{@xml:id}.collectione.meta" />
</xsl:template>

答案 2 :(得分:0)

如果您使用的是Saxon,则可以使用查询参数选择与模式匹配的(现有)文件并递归到子目录(http://saxonica.com/documentation/html/sourcedocs/collections.html)。

collection('aus?select=*.collectione*;recurse=yes')

将返回我认为您感兴趣的文件的文档节点。然后,您可以在每个节点上使用base-uri()来获取其基本URI。

或者,如果您使用Saxon 9.6或其他XSLT 3.0处理器,您可以像Martin Honnen所说的那样使用uri-collection()http://saxonica.com/documentation/html/functions/fn/uri-collection.html)。

获得所有URI后,您可以将它们全部写为顶级文件,并使用xsl:for-each-group按目录对它们进行分组,以获取要在二级文件中写出的文件名,如果你愿意,可以递归地为较低级别做同样的事情。