2011-09-08 47 views
1

所以,如果我有像下面這樣的xml,並且我在節點「FULLTIME」中,我如何知道我在EMPLOYEE而不是承包商?那麼是否有一個我可以使用的函數會返回類似「ROOT/PERSON/EMPLOYEE」的內容,告訴我從FULLTIME節點中父節點是ROOT,PERSON和EMPLOYEE?我似乎無法找到任何能夠提供這一點的東西。我是xslt的新手,所以我的無知可能是我的一大部分,無法找到我想要的東西。xslt我怎麼能得到我在xml中的位置?

<ROOT> 
    <PERSON> 
    <EMPLOYEE> 
     <FULLTIME> 
     <NAME>Mike</NAME> 
     <LAST_NAME>Thompson</LAST_NAME> 
     <EMPLOYEE_ID>1</EMPLOYEE_ID> 
     </FULLTIME> 
     <PARTTIME /> 
    </EMPLOYEE> 
    <CONTRACTOR> 
     <FULLTIME> 
     <NAME>Mike</NAME> 
     <LAST_NAME>Olsen</LAST_NAME> 
     <EMPLOYEE_ID>2</EMPLOYEE_ID> 
     </FULLTIME> 
     <PARTTIME /> 
    </CONTRACTOR> 
    </PERSON> 
</ROOT> 

任何建議將不勝感激!

--S

+0

可以發佈您的xslt文件,它可能會使答案更適合您的應用程序 – Treemonkey

回答

1

ancestor可用於在樹中「查找」。這不是完全清楚你想要做什麼,而是你可以測試,如果員工是你的祖先:

<xsl:if test="ancestor::EMPLOYEE" > 
    ... 
</xsl:if> 
+0

這就是我想要完成的是看到我在樹中的位置。如果我在EMPLOYEE下,我想要x ......如果我在承包商之下,我想要做y。我會嘗試祖先檢查。 – scarpacci

3

你可以使用name()的XPath 1.0功能從FULLTIME節點獲得EMPLOYEECONTRACTOR(或local-name(),如果你使用的命名空間):

<xsl:value-of select="name(..)"/> <!-- Returns EMPLOYEE or CONTRACTOR --> 

如果你想獲得完整的絕對路徑如/ROOT/PERSON/EMPLOYEE,然後使用以下配方:

<xsl:for-each select="ancestor::*"> 
    <xsl:text>/</xsl:text> 
    <xsl:value-of select="name()"/> 
</xsl:for-each> 
1

您可以比賽 EMPLOYEE/FULLTIME或承包商/單獨FULLTIME:

<xsl:template match="EMPLOYEE/FULLTIME"> 
... 
</xsl:template> 

<xsl:template match="CONTRACTOR/FULLTIME"> 
... 
</xsl:template> 

然後在每場比賽你都可以與全職員工和承包商做不同的事情。

這就是我認爲的XSLT方式,而不是其他編程語言的程序思想。