2012-09-24 53 views
2

我有一個要求,我想根據條件從xml中刪除一些標記。從某些情況下過濾掉xml標記

這裏是我的XML輸入:

<?xml version="1.0" encoding="UTF-8"?> 
<TCXML xmlns="http://www.tcxml.org/Schemas/TCXMLSchema"> 
<File creation_date="2012-09-20T07:28:47Z" elemId="id280" exportedFileName="sheet 1" last_mod_date="2012-09-20T07:28:48Z" text_flag="8192"> 

    <GSIdentity elemId="id111" label="R0dB1SzBBT4jNA"/> 

</File> 
    <File creation_date="2012-09-20T07:18:26Z" elemId="id283"exportedFileName="test part" last_mod_date="2012-09-20T07:18:26Z" text_flag="8192"> 

    <GSIdentity elemId="id31" label="SIWBFqLyBT4jNA"/> 

</File> 
    <File creation_date="2012-09-20T07:21:03Z" elemId="id322" exportedFileName="test part3" last_mod_date="2012-09-20T07:21:03Z" text_flag="8192"> 

    <GSIdentity elemId="id46" label="ycUBFqLyBT4jNA"/> 

</File> 
    <File creation_date="2012-09-20T07:18:25Z" elemId="id285" exportedFileName="test part2" last_mod_date="2012-09-20T07:18:25Z" text_flag="4096"> 

    <GSIdentity elemId="id29" label="SQRBFqLyBT4jNA"/> 

</File> 

    <Sheet creation_date="2012-09-20T07:28:48Z" date_released="" ead_paragraph="" elemId="id185" keep_limit_prop="3" last_mod_date="2012-09-20T07:28:48Z" object_desc="" object_name="Sheet 1" ref_list="#id111"> 

    <GSIdentity elemId="id112" label="R4WB1SzBBT4jNA"/> 

</Sheet> 


    <PART creation_date="2012-09-20T07:21:22Z" date_released="" ead_paragraph="" elemId="id435" keep_limit_prop="3" last_mod_date="2012-09-20T07:21:28Z" object_name="dwgTest-AA-dwg1" ref_list="#id29 #id31"> 

    <GSIdentity elemId="id32" label="SxZBFqLyBT4jNA"/> 

</PART> 
    <PART creation_date="2012-09-20T07:21:23Z" date_released="2012-09-20T07:21:27Z" ead_paragraph="" elemId="id438" keep_limit_prop="3" last_mod_date="2012-09-20T07:21:29Z" object_name="dwgTest-AA-dwg2" ref_list="#id46"> 

    <GSIdentity elemId="id21" label="itfBFqLyBT4jNA"/> 

</PART> 
</TCXML> 

我想從這個XML其中有一部分是與ref_list標籤簡稱刪除這些文件標籤。

我想用下面的XSL,

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:plm="http://www.tcxml.org/Schemas/TCXMLSchema" version="1.0"> 
    <xsl:output method="xml" indent="yes"/> 

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

<xsl:template match="plm:File"> 

    <xsl:variable name="Ref_List" select="translate(/plm:TCXML/plm:PART/@ref_list,' ','')" /> 
    <xsl:variable name="currentElementGSId" select="plm:GSIdentity/@elemId" /> 
    <xsl:variable name="RefcurrentElementGSId" select="concat(string('#'),$currentElementGSId)" /> 
    <xsl:choose> 
     <xsl:when test="((contains($Ref_List,$RefcurrentElementGSId))=true())" > 
      </xsl:when> 
    <xsl:otherwise> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy>   
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

以上XSL是工作僅在XML一個部分,而不是全部零件標記從XML,如何通過全部零件標記在XML循環。 感謝您的幫助提前。

我要找輸出該XML如下,

<?xml version="1.0" encoding="UTF-8"?> 
<TCXML xmlns="http://www.tcxml.org/Schemas/TCXMLSchema"> 
<File creation_date="2012-09-20T07:28:47Z" elemId="id280" exportedFileName="sheet 1" last_mod_date="2012-09-20T07:28:48Z" text_flag="8192"> 

    <GSIdentity elemId="id111" label="R0dB1SzBBT4jNA"/> 

</File> 

    <Sheet creation_date="2012-09-20T07:28:48Z" date_released="" ead_paragraph="" elemId="id185" keep_limit_prop="3" last_mod_date="2012-09-20T07:28:48Z" object_desc="" object_name="Sheet 1" ref_list="#id111"> 

    <GSIdentity elemId="id112" label="R4WB1SzBBT4jNA"/> 

</Sheet> 


    <PART creation_date="2012-09-20T07:21:22Z" date_released="" ead_paragraph="" elemId="id435" keep_limit_prop="3" last_mod_date="2012-09-20T07:21:28Z" object_name="dwgTest-AA-dwg1" ref_list="#id29 #id31"> 

    <GSIdentity elemId="id32" label="SxZBFqLyBT4jNA"/> 

</PART> 
    <PART creation_date="2012-09-20T07:21:23Z" date_released="2012-09-20T07:21:27Z" ead_paragraph="" elemId="id438" keep_limit_prop="3" last_mod_date="2012-09-20T07:21:29Z" object_name="dwgTest-AA-dwg2" ref_list="#id46"> 

    <GSIdentity elemId="id21" label="itfBFqLyBT4jNA"/> 

</PART> 
</TCXML> 
+0

您是否注意到目前接受的答案是dos * not *產生提供的通緝結果? –

+0

如果您在答案中發現錯誤,通知發佈錯誤的人會被認爲是禮貌的。如果出現錯誤,我確信@lwburk寧願糾正它。 – Flynn1179

+0

@ Flynn1179,如果一個人自己發現錯誤,這是一個更好的教育體驗。 lwburk是非常有經驗的,他早在你寫這個評論之前就已經找到了原因。另外,他被OP通知他的解決方案不會產生想要的結果。所以,你認爲lwburk沒有被告知這個問題的假設與事實相矛盾。 –

回答

1

你的輸入/輸出不匹配你的描述:

我想從這個XML這是除去那些文件標籤在 PART中用ref_list標籤提到。

下面的XSLT執行等於描述的操作:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:plm="http://www.tcxml.org/Schemas/TCXMLSchema" version="1.0"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="plm:File"> 
     <xsl:choose> 
      <xsl:when test="/plm:TCXML/plm:PART[contains(
       concat(' ', @ref_list, ' '), 
       concat(' #', current()/@elemId, ' '))]"> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:copy> 
        <xsl:apply-templates select="@*|node()" /> 
       </xsl:copy> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

第二個模板丟棄任何File元件,其在elemId任何PART元件的ref_list屬性中找到。所有其他File元素都照原樣複製。

注意:您的模板無法按預期工作,因爲translate預計其第一個參數是一個字符串;你通過一個節點列表,將其轉換爲一個字符串according to the following rule

節點集通過返回的 字符串值轉換爲字符串在節點集合的節點是第一文檔順序。如果 節點集爲空,則返回空字符串。

+0

已更新,以刪除匹配模式中使用的'current'。撒克遜人高興地讓這個飛行,但這是規範不允許的。用於匹配不需要的元素的表達式是相同的,並且不需要對該方法的描述進行改變。 –

+0

感謝您對我的問題所做的工作,但是現在用這個邏輯它應對所有File元素,即使它在PART元素的ref_list屬性中找到,您能否檢查一次。 – parag

+0

@parag - 這不是我看到的行爲。我們確定我們正在朝着同一個目標努力嗎?我將要刪除的'File'的'@ elemId'放在任何'PART'的'@ ref_list'(前面加'#')前面。它準確地消除了這些元素。 –

2

更短,更簡單,而且,最重要的是:正確的解決方案

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:x="http://www.tcxml.org/Schemas/TCXMLSchema"> 
<xsl:output omit-xml-declaration="yes"/> 

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

<xsl:template match="x:File"> 
    <xsl:if test= 
    "not(/*/x:PART/@ref_list 
       [contains(concat(.,' '), 
          concat('#', 
            current()/x:GSIdentity/@elemId, 
            ' ') 
          ) 
       ])"> 
    <xsl:call-template name="identity"/> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 

當這種變換所提供的XML文檔應用:

<TCXML xmlns="http://www.tcxml.org/Schemas/TCXMLSchema"> 
    <File creation_date="2012-09-20T07:28:47Z" elemId="id280" 
     exportedFileName="sheet 1" last_mod_date="2012-09-20T07:28:48Z" 
     text_flag="8192"> 
     <GSIdentity elemId="id111" label="R0dB1SzBBT4jNA"/> 
    </File> 
    <File creation_date="2012-09-20T07:18:26Z" elemId="id283" 
     exportedFileName="test part" last_mod_date="2012-09-20T07:18:26Z" 
     text_flag="8192"> 
     <GSIdentity elemId="id31" label="SIWBFqLyBT4jNA"/> 
    </File> 
    <File creation_date="2012-09-20T07:21:03Z" elemId="id322" 
     exportedFileName="test part3" last_mod_date="2012-09-20T07:21:03Z" 
     text_flag="8192"> 
     <GSIdentity elemId="id46" label="ycUBFqLyBT4jNA"/> 
    </File> 
    <File creation_date="2012-09-20T07:18:25Z" elemId="id285" 
     exportedFileName="test part2" last_mod_date="2012-09-20T07:18:25Z" 
     text_flag="4096"> 
     <GSIdentity elemId="id29" label="SQRBFqLyBT4jNA"/> 
    </File> 
    <Sheet creation_date="2012-09-20T07:28:48Z" date_released="" 
     ead_paragraph="" elemId="id185" keep_limit_prop="3" 
     last_mod_date="2012-09-20T07:28:48Z" object_desc="" 
     object_name="Sheet 1" ref_list="#id111"> 
     <GSIdentity elemId="id112" label="R4WB1SzBBT4jNA"/> 
    </Sheet> 
    <PART creation_date="2012-09-20T07:21:22Z" date_released="" 
    ead_paragraph="" elemId="id435" keep_limit_prop="3" 
    last_mod_date="2012-09-20T07:21:28Z" object_name="dwgTest-AA-dwg1" 
    ref_list="#id29 #id31"> 
     <GSIdentity elemId="id32" label="SxZBFqLyBT4jNA"/> 
    </PART> 
    <PART creation_date="2012-09-20T07:21:23Z" date_released="2012-09-20T07:21:27Z" 
    ead_paragraph="" elemId="id438" keep_limit_prop="3" 
    last_mod_date="2012-09-20T07:21:29Z" object_name="dwgTest-AA-dwg2" 
    ref_list="#id46"> 
     <GSIdentity elemId="id21" label="itfBFqLyBT4jNA"/> 
    </PART> 
</TCXML> 

的想要的,正確的結果(4個文件元素中的3個被「刪除」)被生成:

<TCXML xmlns="http://www.tcxml.org/Schemas/TCXMLSchema"> 
    <File creation_date="2012-09-20T07:28:47Z" elemId="id280" exportedFileName="sheet 1" last_mod_date="2012-09-20T07:28:48Z" text_flag="8192"> 
     <GSIdentity elemId="id111" label="R0dB1SzBBT4jNA"/> 
    </File> 
    <Sheet creation_date="2012-09-20T07:28:48Z" date_released="" ead_paragraph="" elemId="id185" keep_limit_prop="3" last_mod_date="2012-09-20T07:28:48Z" object_desc="" object_name="Sheet 1" ref_list="#id111"> 
     <GSIdentity elemId="id112" label="R4WB1SzBBT4jNA"/> 
    </Sheet> 
    <PART creation_date="2012-09-20T07:21:22Z" date_released="" ead_paragraph="" elemId="id435" keep_limit_prop="3" last_mod_date="2012-09-20T07:21:28Z" object_name="dwgTest-AA-dwg1" ref_list="#id29 #id31"> 
     <GSIdentity elemId="id32" label="SxZBFqLyBT4jNA"/> 
    </PART> 
    <PART creation_date="2012-09-20T07:21:23Z" date_released="2012-09-20T07:21:27Z" ead_paragraph="" elemId="id438" keep_limit_prop="3" last_mod_date="2012-09-20T07:21:29Z" object_name="dwgTest-AA-dwg2" ref_list="#id46"> 
     <GSIdentity elemId="id21" label="itfBFqLyBT4jNA"/> 
    </PART> 
</TCXML> 
+0

感謝您的解決方案。 – parag

+0

@parag,不客氣。 –