2016-09-15 35 views
1

请建议获取通过xslt集合收集的每个文档的绝对路径。如何从集合中获取文件的绝对文档路径

发布脚本能够得到所需绝对路径,但我已经用了两个集合(它可能冒不必要的内存来存储所有文章的信息两次,一次采集,收集信息等一个收集document-uri() S)。

个XML:

d:/DocumentPath/Project-01/2016/ABC/Test.xml

<article> 
    <title>First article</title> 
    <tag1>The tag 1</tag1> 
    <tag3>The tag 3</tag3> 
</article> 

d:/ DocumentPath /项目-01/2016/DEF /测试。 XML

<article> 
    <title>Second article</title> 
    <tag2>The tag 2</tag2> 
    <tag3>The tag 3</tag3> 
</article> 

等个XML ....

XSLT 2.0:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> 

<xsl:variable name="varDocuments"> 
    <xsl:copy-of select="collection('file:///D:/DocumentPath/Project-01/2016/?select=*.xml;recurse=yes') 
     [matches(document-uri(.), '2016/([A-z]+)/.*?.xml')]"/> 
</xsl:variable> 

<xsl:variable name="varDocuments1"> 
    <xsl:copy-of select="collection('file:///D:/DocumentPath/Project-01/2016/?select=*.xml;recurse=yes') 
     [matches(document-uri(.), '2016/([A-z]+)/.*?.xml')]/document-uri(.)"/> 
</xsl:variable> 

<xsl:template match="@*|node()"> 
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy> 
</xsl:template> 

<xsl:template match="/"> 
    <Table border="1"> 
     <TR><TH>Position</TH><TH>Title</TH><TH>Tag1</TH><TH>Tag2</TH><TH>Tag3</TH><TH>Tag4</TH><TH>Path</TH></TR> 
     <xsl:for-each select="$varDocuments"> 
      <xsl:for-each select="article"> 
       <TR> 
        <xsl:variable name="varPos" select="position()"/> 
        <td><xsl:value-of select="position()"/></td> 
        <td><xsl:value-of select="title"/></td> 
        <td><xsl:value-of select="count(descendant::tag1)"/></td> 
        <td><xsl:value-of select="count(descendant::tag2)"/></td> 
        <td><xsl:value-of select="count(descendant::tag3)"/></td> 
        <td><xsl:value-of select="count(descendant::tag4)"/></td> 
        <td><xsl:value-of select="normalize-space(tokenize($varDocuments1, 'file:/')[position()=$varPos + 1])"/></td> 
       </TR> 
      </xsl:for-each> 
     </xsl:for-each> 
    </Table> 
</xsl:template> 

</xsl:stylesheet> 

要求的结果:

<Table border="1"> 
 
    <TR> 
 
     <TH>Position</TH> 
 
     <TH>Title</TH> 
 
     <TH>Tag1</TH> 
 
     <TH>Tag2</TH> 
 
     <TH>Tag3</TH> 
 
     <TH>Tag4</TH> 
 
     <TH>Path</TH> 
 
    </TR> 
 
    <TR> 
 
     <td>1</td> 
 
     <td>First article</td> 
 
     <td>1</td> 
 
     <td>0</td> 
 
     <td>1</td> 
 
     <td>0</td> 
 
     <td>D:/DocumentPath/Project-01/2016/ABC/Test.xml</td> 
 
    </TR> 
 
    <TR> 
 
     <td>2</td> 
 
     <td>Second article</td> 
 
     <td>0</td> 
 
     <td>1</td> 
 
     <td>1</td> 
 
     <td>0</td> 
 
     <td>D:/DocumentPath/Project-01/2016/DEF/Test.xml</td> 
 
    </TR> 
 
    <TR> 
 
     <td>3</td> 
 
     <td>Third article</td> 
 
     <td>1</td> 
 
     <td>0</td> 
 
     <td>0</td> 
 
     <td>2</td> 
 
     <td>D:/DocumentPath/Project-01/2016/GHI/Test.xml</td> 
 
    </TR> 
 
</Table>

回答

2

我首先建议修改

<xsl:variable name="varDocuments"> 
    <xsl:copy-of select="collection('file:///D:/DocumentPath/Project-01/2016/?select=*.xml;recurse=yes') 
     [matches(document-uri(.), '2016/([A-z]+)/.*?.xml')]"/> 
</xsl:variable> 

至少

<xsl:variable name="varDocuments" select="collection('file:///D:/DocumentPath/Project-01/2016/?select=*.xml;recurse=yes') 
     [matches(document-uri(.), '2016/([A-z]+)/.*?.xml')]"/> 

因为似乎没有成为一个需要与collection文件拉,然后用copy-of创建一个额外的副本。

通过该更正,当您使用<xsl:for-each select="$varDocuments">处理每个文档时,您现在可以简单地在那里读出document-uri(.),因为您正在处理拉入的文档,并且没有组装任何副本。

+0

谢谢你的完美建议,先生,得到所需的绝对路径,加上一个。 –

相关问题