xml - xslt 结果文档覆盖或跳过具有重复 uri 的文件

标签 xml xslt xslt-2.0 saxon xslt-3.0

当输出文件具有重复的 URI 时,是否有办法使 xsl:result-document 覆盖或跳过文件?我想我不必提供例子。 我的数据库中有重复的条目。我知道我可以输入一个 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>

这样我认为顺序处理就完成了。

关于xml - xslt 结果文档覆盖或跳过具有重复 uri 的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45688985/

相关文章:

php - 什么是 "Payload"?例如 XML 负载

c# - 解析 XML 文件 - 选项?

xml - XSL : Xpath Query in <xsl:apply-templates> Isn't Returning Any Results

xml - 使用xslt删除基于xml中多个属性的重复节点

ruby - OS X 上的 xslt 2.0 和 Ruby

java - XSLT - 获取区域设置的时区偏移量

java - 如何为所有屏幕尺寸制作灵活的用户界面?

xml - 使用 XSLT 对 XML 进行排序 - 整个 XML 模式未知

xml - 使用 xslt 匹配单独 xml 文件中的元素,然后打印兄弟

xslt - 将条目合并到页码