XSLT, как я могу получить, где я нахожусь в XML? - PullRequest
1 голос
/ 08 сентября 2011

Итак, если у меня есть 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 ]

3 голосов
/ 08 сентября 2011

Вы можете получить EMPLOYEE или CONTRACTOR из узла FULLTIME, используя name() XPath 1.0 (или 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 голос
/ 08 сентября 2011

Вы можете соответствовать СОТРУДНИК / ПОЛНЫЙ ВРЕМЯ или ПОДРЯДЧИК / ПОЛНОЕ ВРЕМЯ:

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

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

Тогда в каждом матче вы можете делать разные вещи с сотрудниками на полную ставку против подрядчиков.

Я думаю, что это XSLT-способ вместо процедурного мышления других языков программирования.

1 голос
/ 08 сентября 2011

Ось ancestor может использоваться для «просмотра» вверх по дереву.Не совсем понятно, что вы хотите сделать, но вы можете проверить, является ли EMPLOYEE вашим предком:

<xsl:if test="ancestor::EMPLOYEE" >
   ...
</xsl:if>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...