当输出文件具有重复的URI时,是否有办法使xsl:result-document覆盖或跳过文件?我想我不必提供一个例子。 我有数据库中有重复的条目。我知道我可以把一个id,然后从60000个文件名删除idxslt结果文件覆盖或跳过具有重复URI的文件
此致敬意。
当输出文件具有重复的URI时,是否有办法使xsl:result-document覆盖或跳过文件?我想我不必提供一个例子。 我有数据库中有重复的条目。我知道我可以把一个id,然后从60000个文件名删除idxslt结果文件覆盖或跳过具有重复URI的文件
此致敬意。
这似乎与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>
那样,我认为顺序处理完成了。
并注意,由于处理的顺序没有定义,因此取决于具体实现,哪些重复项会被这种方式捕获。 –
@MichaelKay,我没有想到,但我认为使用'xsl:iterate'可以避免这个问题,如果需要的话。 –
您可以与撒克逊一起使用的技巧是通过添加查询部分href="{fname}.txt?n={position()}
来使URI唯一,然后在OutputURIResolver中将其取消。
您无法在同一个转换中两次写入相同的URI。如果你想识别重复,那么当然在XSLT 2或更高版本中,你可以使用'xsl:for-each-group select =“// record”group-by =“fname”',只有你似乎也在处理一些为您的大量输入提供流媒体解决方案,因此可能会更复杂。你需要发布一些细节以获得更具体的帮助。 –