xslt我怎样才能在xml中找到我所处的位置?

时间:2011-09-08 13:11:16

标签: xml xslt

因此,如果我的xml看起来如下所示并且我在节点“FULLTIME”中,我怎么能告诉我我在EMPLOYEE而不是承包商?那么有一个我可以使用的函数会返回类似“ROOT / PERSON / EMPLOYEE”的东西,告诉我从FULLTIME节点开始,父节点是ROOT,PERSON和EMPLOYEE吗?我似乎找不到任何可以提供的东西。我是xslt的新手,所以我的无知可能是我无法找到我想要的东西的重要部分。

<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

3 个答案:

答案 0 :(得分:3)

您可以使用name() XPath 1.0函数从EMPLOYEE节点获取CONTRACTORFULLTIME(如果您正在使用命名空间,则可以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 :(得分:1)

ancestor轴可用于在树中“查找”。目前还不完全清楚你想做什么,但你可以测试EMPLOYEE是否是你的祖先:

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

答案 2 :(得分:1)

您可以匹配 EMPLOYEE / FULLTIME或CONTRACTOR / FULLTIME:

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

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

然后在每场比赛中,你可以与全职员工和承包商做不同的事情。

我认为,这是XSLT方式而不是其他编程语言的程序性思维。