2011-05-10 78 views
2

我有,這個XML查找表:如何檢查標籤查找表

<lookup> 
<Codes> 
<code>123<code> 
</Codes> 
<Codes> 
<code>321<code> 
</Codes> 
</lookup> 

和文件:

<document> 
<header> 
<remarks>test</remarks> 
</header> 
<Line> 
<Line-Item> 
<code>123</code> 
</Line-Item> 
<Line-Item> 
<code>444</code> 
</Line-Item> 
<Line-Item> 
<code>321</code> 
</Line-Item> 
</Line> 
</document> 

有可能,檢查與查找表的代碼文件的代碼,如果文檔代碼=查找代碼,從文檔中刪除行項目。

的答案應該是:

<document> 
<header> 
<remarks>test</remarks> 
</header> 
<Line> 
<Line-Item> 
<code>444</code> 
</Line-Item> 
</Line> 
</document> 

我卡上的xsl:樣式版本= 「1.0」。 最好的問候:)

+0

問得好,+1。查看我的答案,獲得一個完整的XSLT 1.0解決方案,即使在這種邊緣情況下,當查找表中包含所有「行項目/代碼」值時,該解決方案仍能正常工作。 – 2011-05-11 04:09:26

回答

1

這種轉變

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:variable name="vCodes" select= 
"document('file:///c:/temp/LookupDelete.xml')/*/*/code"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match= 
"Line-Item[code 
      = document('file:///c:/temp/LookupDelete.xml') 
        /*/*/code 
      ] 
"/> 

<xsl:template match= 
    "Line[not(Line-Item/code 
       [not(. = document('file:///c:/temp/LookupDelete.xml') 
           /*/*/code 
        ) 
       ] 
      ) 
     ] 
    "/> 
</xsl:stylesheet> 

時所提供的XML文檔應用:

<document> 
    <header> 
     <remarks>test</remarks> 
    </header> 
    <Line> 
     <Line-Item> 
      <code>123</code> 
     </Line-Item> 
     <Line-Item> 
      <code>444</code> 
     </Line-Item> 
     <Line-Item> 
      <code>321</code> 
     </Line-Item> 
    </Line> 
</document> 

產生想要的,正確的結果

<document> 
    <header> 
     <remarks>test</remarks> 
    </header> 
    <Line> 
     <Line-Item> 
     <code>444</code> 
     </Line-Item> 
    </Line> 
</document> 

如果該文件是這樣的

<document> 
    <header> 
     <remarks>test</remarks> 
    </header> 
    <Line> 
     <Line-Item> 
      <code>123</code> 
     </Line-Item> 
     <Line-Item> 
      <code>321</code> 
     </Line-Item> 
     <Line-Item> 
      <code>321</code> 
     </Line-Item> 
    </Line> 
</document> 

然後再正確的結果產生(注意沒有Line元件輸出的話):

<document> 
    <header> 
     <remarks>test</remarks> 
    </header> 
</document> 
+0

謝謝你的回答,我正在尋找和你寫的一樣的東西。 – Petras 2011-05-11 05:58:46

+0

@Petras:不客氣。 – 2011-05-11 12:48:11

1
<!-- codes of items to exclude from external document --> 
<xsl:variable name="lookup-table" select="document('lookup-table.xml')/lookup/Codes/code"/> 

<!-- exclude Line-Items with codes from lookup table --> 
<xsl:template match="Line-Item[ code = $lookup-table ]"/> 

<!-- 
    exclude <Line> elements, 
    which contains only <Line-Item>'s which will be removed   
--> 
<xsl:template match="Line[ not(Line-Item[ code != $lookup-table ]) ]"/> 

<!-- copy all other items --> 
<xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl;apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 
+0

不幸的是,這個解決方案在XSLT 1.0中不起作用。試用XSLT 1.0處理器。 – 2011-05-11 04:07:18

+0

感謝tryng,但我注意到,在XSLT 1.0中工作。 – Petras 2011-05-11 05:56:04

1

這個樣式表產生期望的結果:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:lookup="lookup"> 
    <lookup:lookup> 
     <Codes> 
      <code>123</code> 
     </Codes> 
     <Codes> 
      <code>321</code> 
     </Codes> 
    </lookup:lookup> 
    <xsl:variable name="lookup" select="document('')/*/*/Codes"/> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Line"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | 
       node()[not(self::Line-Item[code=$lookup/code])]"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

注意,查找表包含在樣式表。如果它太大而不能包含在轉換中,它可以很容易地包含在單獨的文檔中。

+1

@lwburk:我不認爲這個答案是正確的,因爲當所有'Line-Item/code'元素值都在查找表中時,它仍然會產生一個'Line'元素。 – 2011-05-11 04:05:03

+0

@lwburk:謝謝你的回答。我會嘗試。 – Petras 2011-05-11 05:57:32

+0

@Dimitre - 足夠公平,但我試圖想象一個空'Line'元素可能很重要的場景。思考? – 2011-05-11 14:53:16