Подтвердить что ты не робот

Концепция XML XLST предшествующий брат и предок

Я очень новичок в xslt и нашел, что это может быть легко или сложно. Я хочу прояснить некоторые концепции. Что предшествует родному брату и тому, что является предком, после поиска из google я нашел объяснение предка. и диаграмма с их сайта упрощает понимание.

Но я до сих пор не понимаю предшествующего брата

<product>
    <inventory>
        <drink>
            <lemonade>
                <price>$2.50</price>
                <amount>20</amount>
            </lemonade>
            <pop>
                <price>$1.50</price>
                <amount>10</amount>
            </pop>
        </drink>
          <service>
           <address />
            <phone />
            <delivery> City </delivery>
          </service>      
        <snack>
            <chips>
                <price>$4.50</price>
                <amount>60</amount>
            </chips>
        </snack>
        <hotfood></hotfood>
         <totalprice> $15</totleprice>

    </inventory>
</product>

так как я могу прочитать этот previous-sibling:: pop/ancestor:: inventory/totalprice

ancestor:: inventory/totalprice = product\inventory\totalprice previous-sibling:: pop - я не понимаю этого то как читать все вместе?

Большое спасибо

4b9b3361

Ответ 1

Очередь предшествующего сиблинга:: ось

Очередь предшествующего -сборника:: ось - это ось навигации, которая включает в себя все предыдущие элементы родственного элемента для элемента фокусировки. Под "родством" мы подразумеваем другой элемент, который имеет один и тот же родительский элемент для ссылочного элемента. Под "предшествующим" мы понимаем a node, который предшествует эталонному. Порядок предыдущей оси - это порядок обратного документа. Взгляните на этот документ:

<fruit>
  <banana>
   <lady-finger-banana/>
  </banana> 
  <apple/>
  <pear/>
  <kiwi/>
</fruit>

Если фокус node является грушей, то последовательность before-sibling:: * is...

  • яблоко
  • банан

Примечание: фрукты, груша, леди-палка-банан и киви не находятся в последовательности.

Итак, верно следующее:

  • previous-sibling:: * [1] - это яблоко
  • previous-sibling:: * [2] является бананом
  • count (previous-sibling:: *) - 2
  • previous-sibling:: apple [1] также является яблоком
  • previous-sibling:: banana [1] - это банан
  • previous-sibling:: * [3] отсутствует или пустая последовательность

previous-sibling:: pop/ancestor:: inventory/totalprice Пример

Нам нужно немного изменить ваш образец документа, чтобы полезно изучить этот пример

<product>
    <inventory>
        <drink>
            <lemonade>
                <price>$2.50</price>
                <amount>20</amount>
            </lemonade>
            <pop>
                <price>$1.50</price>
                <amount>10</amount>
            </pop>
            <focus-item />
         </drink>
        <totalprice>$15</totalprice>  
    </inventory>
</product>

Скажем, основное внимание уделяется элементу фокуса элемента. Чтобы оценить выражение before-sibling:: pop/ancestor:: inventory/totalprice, выполните следующие действия.

  • previous-sibling:: pop выбирает все предыдущие поп-элементы для фокуса. Это оценивает последовательность из одного node.
  • Для каждого элемента в левой руке (только один поп-элемент, который это происходит), установите этот элемент как элемент временного фокуса и оцените выражение права оператора /, который...

    ancestor::inventory
    

    Существует только один такой node, который является инвентарем предков node. Таким образом, первый/оператор оценивает последовательность одного инвентаря node.

  • Теперь мы оцениваем эффект второй/и ее правой стоимости выражения операнда. Для каждого элемента в левой руке (только один инвентарь node, так оно и происходит), установите это как элемент временного фокуса и оцените totalprice.

  • totalprice является коротким для child:: totalprice. На дочерней оси временного фокуса node имеется только один общий ценовой элемент, поэтому конечным результатом является последовательность из одного node, который является общей ценой node.

Понимание по диаграммам

Пожалуйста, посмотрите эту страницу для иллюстрации осей.

Вот копия этой страничной диаграммы для previous-sibling::. В ней ссылка node - это Charlie, а node на предыдущей оси sibling:: green. Это единственный такой node. enter image description here

Ответ 2

Оси, полезные для навигации по дереву node. Это зависит от вашей проблемы, какая ось полезна.

Следующая таблица стилей иллюстрирует разницу.

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="1.0">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="snack">
        <xsl:variable name="siblings" select="ancestor::node()"/>
        <debug>
        <xsl:for-each select="preceding-sibling::node()">
                <sibling>
                        <xsl:value-of select="local-name()"/>
                </sibling>
        </xsl:for-each>
        <xsl:for-each select="ancestor::node()">
                <ancestor>
                        <xsl:value-of select="local-name()"/>
                </ancestor>
        </xsl:for-each>

        </debug>
   </xsl:template>

   <xsl:template match="*">
         <xsl:apply-templates select="*"/>
   </xsl:template>
</xsl:stylesheet>

Ответ 3

Предшествующий брат получает всех родственных братьев, которые предшествовали ему в текущем уровне node. Если вы не укажете одного или нескольких из предшествующих братьев и сестер с выражением xpath. Если вы укажете конкретный предыдущий-родной язык с xpath, он всегда начинается с 1 в квадратных скобках.

Предки - это первый сопоставимый предк, который соответствует выражению. Таким образом, он возвращается к дереву node, чтобы посмотреть на соответствующее выражение, основанное на том, где вы сейчас указываете. Итак, если вы были в продукте/инвентаре/напитке/поп-музыке или просто/поп, то инвентарь предка /totalprice просто ищет место для frist, и он должен возвращать обратно указатель, указывая на соответствующий случай, иначе он ничего не укажет, а вы "Я все еще буду указывать на поп.