2017-08-15 122 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中將其取消。