xslt 结果文档覆盖或跳过具有重复 uri 的文件
xslt result-document overwrite or skip file with duplicate uri
有没有办法在输出文件具有重复 URI 时使 xsl:result-文档覆盖或跳过文件?我想我不必提供示例。
我的数据库中有重复的条目。我知道我可以输入一个 id,然后从 60000 个文件的名称中删除 id
此致。
似乎在 XSLT 3.0 中,您可以使用 xsl:try/xsl:catch
捕获错误,以便两次写入输出 URI,给定样式表
<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>
Saxon 9.8 EE 使用流处理输入并写入两个结果文件,同时在处理第三条记录时尝试第二次写入 result1.txt
时捕获错误。
至于@MichaelKay 关于捕获哪些重复项的实现依赖性的评论,我同意这一点,但如果避免这种情况很重要,那么我们可以简单地替换
<xsl:template match="/">
<xsl:apply-templates select="copy-of(root/record)" mode="result"/>
</xsl:template>
使用 xsl:iterate
<xsl:template match="/">
<xsl:iterate select="root/record">
<xsl:apply-templates select="copy-of()" mode="result"/>
</xsl:iterate>
</xsl:template>
这样我认为顺序处理就完成了。
您可以在 Saxon 中使用的一个技巧是通过添加查询部分 href="{fname}.txt?n={position()}
使 URI 唯一,然后在 OutputURIResolver 中将其删除。
有没有办法在输出文件具有重复 URI 时使 xsl:result-文档覆盖或跳过文件?我想我不必提供示例。 我的数据库中有重复的条目。我知道我可以输入一个 id,然后从 60000 个文件的名称中删除 id
此致。
似乎在 XSLT 3.0 中,您可以使用 xsl:try/xsl:catch
捕获错误,以便两次写入输出 URI,给定样式表
<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>
Saxon 9.8 EE 使用流处理输入并写入两个结果文件,同时在处理第三条记录时尝试第二次写入 result1.txt
时捕获错误。
至于@MichaelKay 关于捕获哪些重复项的实现依赖性的评论,我同意这一点,但如果避免这种情况很重要,那么我们可以简单地替换
<xsl:template match="/">
<xsl:apply-templates select="copy-of(root/record)" mode="result"/>
</xsl:template>
使用 xsl:iterate
<xsl:template match="/">
<xsl:iterate select="root/record">
<xsl:apply-templates select="copy-of()" mode="result"/>
</xsl:iterate>
</xsl:template>
这样我认为顺序处理就完成了。
您可以在 Saxon 中使用的一个技巧是通过添加查询部分 href="{fname}.txt?n={position()}
使 URI 唯一,然后在 OutputURIResolver 中将其删除。