2012-07-24 78 views
0

我需要選擇Property1和SubProperty2並去除任何其他屬性。我需要做出這個未來的證明,以便任何添加到xml的新屬性都不會破壞驗證。喵的新領域必須被剝離默認。在使用XSLT選擇屬性時遇到困難

<Root> 
    <Property1/> 
    <Property2/> 
    <Thing> 
     <SubProperty1/> 
     <SubProperty2/> 
    </Thing> 
    <VariousProperties/> 
</Root> 

所以在我的XSLT我這樣做:

<xsl:template match="Property1"> 
    <Property1> 
     <xsl:apply-templates/> 
    </Property1> 
    </xsl:template> 

<xsl:template match="/Thing"> 
    <SubProperty1> 
     <xsl:apply-templates select="SubProperty1" /> 
    </SubProperty1> 
</xsl:template> 

<xsl:template match="*" /> 

最後一行應該剝奪任何東西我還沒有確定被選中。

這可以選擇我的property1,但它總是爲SubProperty選擇一個空節點。 *之前的比賽似乎會在比賽結束之前剝離更深的對象,以便他們能夠正常工作。 我刪除了*上的匹配,並選擇了具有值的SubProperty。那麼,如何選擇子屬性,然後將所有我不使用的東西去掉。

感謝您的任何建議。

+0

沒關係......我想通了,怎麼辦,我需要什麼? – user1549583 2012-07-24 19:35:54

回答

0

有兩個問題

<xsl:template match="*"/> 

這忽略了其中沒有一個壓倒一切的,更具體的模板的任何元素。

因爲頂部元素Root沒有特定的模板,所以它會被忽略以及它的所有子樹 - 這是完整的文檔 - 根本沒有輸出。

第二個問題是在這裏

<xsl:template match="/Thing"> 

這個模板命名Thing頂部元素相匹配。

但是,在提供的文檔中,頂層元素名爲Root。因此,上述模板與提供的XML文檔中的任何節點都不匹配,並且從不選擇執行。由於其正文中的代碼應該生成SubProperty1,因此不會生成此類輸出。

解決方案

變化

<xsl:template match="*"/> 

<xsl:template match="text()"/> 

和更改

<xsl:template match="/Thing"> 

<xsl:template match="Thing"> 

整個改造成爲

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

     <xsl:template match="Property1"> 
     <Property1> 
      <xsl:apply-templates/> 
     </Property1> 
     </xsl:template> 

    <xsl:template match="Thing"> 
     <SubProperty1> 
      <xsl:apply-templates select="SubProperty1" /> 
     </SubProperty1> 
    </xsl:template> 

    <xsl:template match="text()" /> 
</xsl:stylesheet> 

當在下面的XML文檔應用(如提供的是嚴重畸形的它不得不被修復):

<Root> 
    <Property1/> 
    <Property2/> 
    <Thing> 
     <SubProperty1/> 
     <SubProperty2/> 
    </Thing> 
    <VariousProperties/> 
</Root> 

現在的結果是什麼都想

<Property1/> 
<SubProperty1/>