概念XML XLST前同辈和祖先(Concept XML XLST preceding-siblin

2019-06-28 02:23发布

我很新的XSLT,并发现它可以很容易的或复杂的。 我要澄清一些概念。 什么是前同辈,什么是祖先,从谷歌搜索后,我找到了祖先的解释。 并从他们的网站图表使得更容易理解。

但我还是不明白,前同辈

<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>

所以我怎么看这个前同辈::流行/祖先::库存/ totalprice

祖先::库存/ totalprice =产品\库存\ totalprice前同辈::流行 - 我不明白这一个再怎么一起看?

非常感谢

Answer 1:

的前同辈::轴

的前同辈::轴是导航的轴线,包括所有前面的同级元素的聚焦元件。 所谓“兄弟”是指具有相同的父参考物品不同的元素。 通过“前面的”我们指的是一个参考之前ocurrs一个节点。 前述-sibling轴的顺序是相反的文档顺序。 看看这个文件:

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

如果焦点节点是梨,然后顺序前同辈:: *是...

  1. 苹果
  2. 香蕉

注:水果,梨,淑女手指香蕉和猕猴桃不是顺序排列。

所以下面是正确的:

  1. 前同辈:: * [1]是苹果
  2. 前同辈:: * [2]是香蕉
  3. 计数(前同辈:: *)为2
  4. 前同辈::苹果[1]也是苹果
  5. 前同辈::香蕉[1]是香蕉
  6. 前同辈:: * [3]是不存在或空序列

前同辈::流行/祖先::库存/ 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>

我们要说的重点是对元素焦点项目。 为了评价表达前同辈::流行/祖先::库存/ totalprice按照下列步骤

  1. 前同辈::弹出选择所有前面的流行元素集中项目。 这个计算结果为一个节点的序列。
  2. 在左手序列(它恰巧仅一个弹出元件)的每个项目,将该项目设定为临时焦点项目,评价的/操作者这是右边的表达式...

     ancestor::inventory 

    只有一个这样的节点,这是祖传的库存节点。 因此,第一/操作者评估为一个库存节点的序列。

  3. 现在,我们评估第二/和其右边的操作数表达总价的效果。 对于左手序列中的每个项目(只是一个库存节点,以便它发生),设置这是一个临时的重点项目和评估totalprice。

  4. totalprice是短期的孩子:: totalprice。 有在临时集中节点的子轴只有一个总价格的元素,所以最后的结果是一个节点,也就是总价格节点的序列。

了解通过图表

请看看这个页面的轴系的说明。

这里是前同辈该页面的图的复印件::。 在它的参考节点是查理和对前同辈节点::轴是绿色。 它是唯一这样的节点。



Answer 2:

轴通过节点树导航有用。 所以,这取决于您的问题,什么样的轴是有用的。

下面的样式表说明的差异。

<?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>


Answer 3:

前同辈得到它之前在当前节点级别的所有元素的兄弟姐妹。 除非你指定使用XPath表达式前面的那些兄弟姐妹中的一个或多个。 如果您使用XPath指定一个特定的前同辈它总是用方括号1开始。

祖先是第一匹配祖先该表达式相匹配。 如此这般备份节点树会根据你目前指向哪里看匹配的表达。 所以,如果你是在产品/库存/饮料/ POP或只/弹出然后祖广告/ totalprice只是看起来对弗里斯特发生和它应该只返回回指针指向匹配的情况下,否则将指向什么和你“会仍处于流行被人指指点点。



文章来源: Concept XML XLST preceding-sibling and ancestor
标签: xml xslt xpath