2017-02-09 50 views
0

我是一名xsl初學者,我一直試圖讓這個工作幾天,但我有一些問題。我已經做了一些研究並嘗試了幾種不同的解決方案,但我似乎無法做到。使用xsl 1.0和指定的輸入,我需要刪除重複項,並且能夠篩選特定的關鍵詞。如何刪除重複項和篩選XSL中的特定內容?

這裏是輸入:

<vce> 
<document> 
    <content name="title">X</content> 
    <content name="description"> 
     <content name="h3">A</content> 
     <content name="h3">B</content> 
     <content name="h3">C</content> 
     <content name="h3">A</content> 
     <content name="h3">B</content> 
     <content name="h3">C</content> 
     <content name="h3">D</content> 
     <content name="h3">E</content> 
     <content name="h3">F</content> 
     <content name="h3">G</content> 
    </content> 
</document> 
</vce> 

在描述中,我只能接受A,B和C,也需要確保有沒有重複。因此,我需要的輸出應該是:

<vce> 
<document> 
    <content name="title">X</content> 
    <content name="description"> 
     <content name="h3">A</content> 
     <content name="h3">B</content> 
     <content name="h3">C</content> 
    </content> 
</document> 
</vce> 

這是我目前正在工作:提前

<xsl:template match="/"> 
    <vce> 
    <document> 
     <content name="title"> 
     <xsl:for-each select="//document/content[@name='title']"> 
      <xsl:value-of select="." /> 
     </xsl:for-each> 
     </content> 

     <content name="description"> 
     <xsl:for-each select="//document/content[@name='h3']"> 
      <xsl:if test="not(preceding::document[content[@name='h3']/text() = current()/content[@name='h3']/text()])"> 
      <content name="h3"> 
       <xsl:value-of select="." /> 
      </content> 
      </xsl:if> 
     </xsl:for-each> 
     </content> 
    </document> 
    </vce> 
</xsl:template> 

感謝的時間,你的球員的努力!

+0

*我是一個xsl初學者,我一直試圖讓這個工作幾天現在* ...和這個XSLT試驗在哪裏? – Parfait

+0

什麼版本的XSLT? –

+0

我與1.0版 –

回答

0

因爲很多你輸入的不是輸出發生變化,我會用identity transform開始一切都拷貝過來的,在默認情況下。然後,您可以添加模板以覆蓋需要的身份轉換。

你還需要使用分組的Muenchian Method以便移除重複的。

你的輸入是超級基本的,所以希望這將與您的實際數據的工作。

XML輸入

<vce> 
    <document> 
     <content name="title">X</content> 
     <content name="description"> 
      <content name="h3">A</content> 
      <content name="h3">B</content> 
      <content name="h3">C</content> 
      <content name="h3">A</content> 
      <content name="h3">B</content> 
      <content name="h3">C</content> 
      <content name="h3">D</content> 
      <content name="h3">E</content> 
      <content name="h3">F</content> 
      <content name="h3">G</content> 
     </content> 
    </document> 
</vce> 

XSLT 1.0

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

    <xsl:key name="desc" match="content[@name='description']/content" use="."/> 

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

    <xsl:template match="content[@name='description']"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:for-each select="content[.='A' or .='B' or .='C'] 
     [count(.|key('desc',.)[1])=1]"> 
     <xsl:apply-templates select="."/> 
     </xsl:for-each> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

輸出

<vce> 
    <document> 
     <content name="title">X</content> 
     <content name="description"> 
     <content name="h3">A</content> 
     <content name="h3">B</content> 
     <content name="h3">C</content> 
     </content> 
    </document> 
</vce> 

這裏的另一個版本日可能會更容易管理「允許」元素。

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

    <xsl:param name="allowed" select="'|Step A.|Step B.|Step C.|'"/> 

    <xsl:key name="desc" match="content[@name='description']/content" use="."/> 

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

    <xsl:template match="content[@name='description']"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:for-each select="content[contains($allowed,concat('|',normalize-space(),'|'))] 
     [count(.|key('desc',.)[1])=1]"> 
     <xsl:apply-templates select="."/> 
     </xsl:for-each> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

怎麼樣,如果我一直在尋找的內容不僅僅是A,B更加複雜,並C.例如,如果我在尋找包含關鍵字「步」的任何文本或工作數字後跟'。' [。= 'A' 或= 'B' 或= 'C']:(即 '1'),將

+0

@MarkB - 是仍然應該工作?很好,你可能希望使用'normalize-space()'而不是''',儘管如此,任何多餘的空格都不會影響比較。例如:'normalize-space()='第1步。還增加了另一個使用xsl:param來保存比較結果的例子,這樣可以更容易管理,至少應該是一個好的開始。 –