2015-12-07 57 views
0

刪除相應的值我有一個xml:XSLT讀文件到變量和XML

<root> 
    <tag1> 
     <tag2 id="111" pid="000" name="name1"> 
      <tag3>xxx</tag3> 
      ...more tags... 
     </tag2> 
     <tag2 id="222" nid="111" name="name2"> 
      <tag3>yyy</tag3> 
      ...more tags... 
     </tag2> 
    </tag1> 
    ...more tags... 
</root> 

而且一個txt文件(name.txt)與名義值的列表:

name1 
name3 
.... 

是它可能有一個xslt從name.txt中讀取,使用名稱屬性匹配list.txt中的列表來刪除tag2。所以XML的輸出將是:

<root> 
    <tag1> 
     <tag2 id="222" nid="111" name="name2"> 
      <tag3>yyy</tag3> 
      ...more tags... 
     </tag2> 
    </tag1> 
    ...more tags... 
</root> 

歡呼聲中,李

+0

XSLT 1.0無法讀取外部文本文件。你是否能夠在初始化轉換時將名稱作爲參數傳遞?或者你可以修改文本文件,使它至少有一個XML包裝? –

+0

是的,我可以將XML包裝添加到測試文件。下一步如何繼續?謝謝, – dellair

+0

好。你實際使用哪種XSLT 1.0處理器? –

回答

1

如果你可以修改外部文件看起來像這樣:

名.xml

<names> 
name1 
name3 
</names> 

則可以使用下面的樣式表:

XSLT 1.0 + EXSLT

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:str="http://exslt.org/strings" 
extension-element-prefixes="str"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="names-doc" select="'names.xml'"/> 
<xsl:variable name="names" select="str:tokenize(document($names-doc)/names, '&#10;')" /> 

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

<xsl:template match="tag2"> 
    <xsl:if test="not(@name = $names)"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 

這需要一個XSLT 1.0處理器,諸如的libxslt,支撐EXSLT str:tokenize()功能。

+0

獲取「模式中不允許使用變量引用」。 – dellair

+0

@dellair這很奇怪:我用libxslt測試過它,它適用於我這裏。但從技術上講它是正確的:改爲嘗試編輯的版本。 –

+0

不適合你喝啤酒。不夠感謝你。 :) – dellair

1

我會用

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:param name="text-url" select="'name.txt'"/> 

<xsl:variable name="names" select="tokenize(unparsed-text($text-url), '\r?\n+')"/> 

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


<xsl:template match="tag2[@name = $names]"/> 

</xsl:stylesheet> 
+0

剛剛發佈完全相同的答案。 +1不知道我通過這個問題第一次讀到什麼: -/ –

+0

*擁抱*,對不起,正在尋找xslt 1.0。剛剛修改了這個問題。你能諮詢一下嗎? – dellair