當輸出文件具有重複的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」',只有你似乎也在處理一些爲您的大量輸入提供流媒體解決方案,因此可能會更復雜。你需要發佈一些細節以獲得更具體的幫助。 –