2017-08-15 87 views
1

当输出文件具有重复的URI时,是否有办法使xsl:result-document覆盖或跳过文件?我想我不必提供一个例子。 我有数据库中有重复的条目。我知道我可以把一个id,然后从60000个文件名删除idxslt结果文件覆盖或跳过具有重复URI的文件

此致敬意。

+0

您无法在同一个转换中两次写入相同的URI。如果你想识别重复,那么当然在XSLT 2或更高版本中,你可以使用'xsl:for-each-group select =“// record”group-by =“fname”',只有你似乎也在处理一些为您的大量输入提供流媒体解决方案,因此可能会更复杂。你需要发布一些细节以获得更具体的帮助。 –

回答

2

这似乎与XSLT 3.0可以捕获错误写入URI两次使用xsl:try/xsl:catch一个输出,考虑到样式表

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
    xmlns:err="http://www.w3.org/2005/xqt-errors" 
    exclude-result-prefixes="xs math" 
    version="3.0"> 

    <xsl:mode streamable="yes"/> 

    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="copy-of(root/record)" mode="result"/> 
    </xsl:template> 

    <xsl:template match="record" mode="result"> 
     <xsl:try> 
      <xsl:result-document href="{fname}.txt" method="text"> 
       <xsl:value-of select="* except fname" separator=","/> 
      </xsl:result-document> 
      <xsl:catch errors="err:XTDE1490"> 
       <xsl:message select="'Attempt to write more than once to ', fname"/> 
      </xsl:catch> 
     </xsl:try> 
    </xsl:template> 

</xsl:stylesheet> 

和像

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <record> 
     <fname>result1</fname> 
     <foo>1</foo> 
     <bar>a</bar> 
    </record> 
    <record> 
     <fname>result2</fname> 
     <foo>2</foo> 
     <bar>b</bar> 
    </record> 
    <record> 
     <fname>result1</fname> 
     <foo>1</foo> 
     <bar>a</bar> 
    </record> 
</root> 

输入撒克逊9.8 EE处理输入流并写入两个结果文件,同时在处理第三条记录时第二次尝试写入result1.txt时捕获错误。

至于@ MichaelKay的有关实现的依赖性哪个重复会被抓住的评论,我同意,但如果它的事项,以避免那么我们可以简单地用一用的xsl:iterate取代

<xsl:template match="/"> 
    <xsl:apply-templates select="copy-of(root/record)" mode="result"/> 
</xsl:template> 

<xsl:template match="/"> 
    <xsl:iterate select="root/record"> 
     <xsl:apply-templates select="copy-of()" mode="result"/> 
    </xsl:iterate> 
</xsl:template> 

那样,我认为顺序处理完成了。

+1

并注意,由于处理的顺序没有定义,因此取决于具体实现,哪些重复项会被这种方式捕获。 –

+0

@MichaelKay,我没有想到,但我认为使用'xsl:iterate'可以避免这个问题,如果需要的话。 –

2

您可以与撒克逊一起使用的技巧是通过添加查询部分href="{fname}.txt?n={position()}来使URI唯一,然后在OutputURIResolver中将其取消。