Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 我应该使用哪一个:前置::还是前置同级::?_Xml_Xslt_Xpath - Fatal编程技术网

Xml 我应该使用哪一个:前置::还是前置同级::?

Xml 我应该使用哪一个:前置::还是前置同级::?,xml,xslt,xpath,Xml,Xslt,Xpath,我正在犹豫是否要在XSL中编写前置或前置同级,例如下面的示例xml <sales_division> <team area="Tokyo"> <staff>Sato</staff> <staff>Tanaka</staff> </team> <team area="Osaka"> <staff>Ueda</staff> <sta

我正在犹豫是否要在XSL中编写
前置
前置同级
,例如下面的示例xml

<sales_division>
  <team area="Tokyo">
    <staff>Sato</staff>
    <staff>Tanaka</staff>
  </team>
  <team area="Osaka">
    <staff>Ueda</staff>
    <staff>Suzuki</staff>
  </team>
</sales_division>
请给我您的建议和意见。

最好编写一个有意义的XPath,因为它更易于阅读和维护。因此,我想说我更喜欢第一种方式,因为它最接近你意图的英文描述:

preceding-sibling::team/staff[1]
或者更具体(如有必要):


此外,元素位置通常意义不大,并且在XML排列上稍有变化时容易中断,因此我建议不要过多地依赖元素位置索引。

在我看来,您(也)在询问这些轴的实际用途。正如Michael和Har已经指出的,这实际上取决于大局是否选择其中一个。在实践中,需要
前面的
,以及在较小程度上需要
前面的兄弟姐妹
,这可能是代码气味的一种迹象,它们的性能可能有害,具体取决于输入和谓词

假设您的输入略有不同:

<sales_division>
  <team area="New York">
    <staff>John</staff>
  </team>
  <team area="Tokyo">
    <staff>Sato</staff>
    <staff>Tanaka</staff>
  </team>
  <staff />
  <team area="Osaka">
    <staff>Ueda</staff>
    <staff>Suzuki</staff>
  </team>
</sales_division>

约翰
佐藤
田中
上田
铃木
1) 前兄弟姐妹::团队/员工[1]

前面的同级轴是一个反向轴,这意味着它通过同级从下到上。
staff
步骤实际上是
child::staff
,这本身就是向前的一步

你在问:

  • 选取前面所有匹配
    团队的兄弟姐妹
  • 在所有这些中,向下选择第一个
    staff
  • 在增强XML中,这将选择“John”
2) 职员[2]

前一个轴也是一个反向轴,但它不是遍历兄弟节点,而是遍历所有已传递的节点(意思是:如果节点仍在当前祖先轴中,则未选中),深度优先(意思是:
staff
中的文本节点位于
staff
子节点之前,子节点位于
team
兄弟节点之前)

你在问:

  • 取前面所有与
    staff
    匹配的节点,即空节点、田中节点、佐藤节点和约翰节点(按顺序)
  • 选择找到的第二个
  • 在增强XML中,这将选择Tanaka
3) ../team[1]/staff[1]

父节点()
的缩写。它意味着获取当前节点的父节点(即根元素
销售部门

你在问:

  • 转到母公司
    销售部门
  • 从那里往下走,找到第一个匹配的孩子
    团队
  • 从那里找到第一个匹配
    staff
  • 在增强XML中,这是John
因此,总之,它取决于实际的XML结构。前一个同级的典型用例是XML的顺序已知且有意义(例如,两个坐标,其中前一个同级是经度,当前是纬度)


实际上,我更经常地看到,您需要在当前节点之前或之后具有同级的元素。在这种情况下,
(父)语法可能是最好的方法,可能会将当前节点从节点集中排除。这在XSLT2.0和3.0中比在1.0中更容易。

如果您确切知道XML中的内容,您不需要这些表达式中的任何一个,您只需编写“Sato”。您可能需要浏览XML,因为您了解它的结构,但不完全了解它的内容。因此,你的导航方式是通过使用你知道的来发现你不知道的。这使得我们无法帮助您,因为您还没有告诉我们XML中有多少是可变的,有多少是固定的。

谢谢您,“har07”。我能理解你。我尽量不要过多地使用元素位置。“元素位置通常意义不大”,这取决于XML文档的模式(我们实际上对其一无所知)。它可能毫无意义,也可能至关重要,这取决于你为什么需要它。你的例子中的三个表达只是巧合而已。谢谢你,迈克尔先生。我认为你是对的。在我的工作中,我有机会将XML转换为HTML。所以我必须用XSLT编写XPath。我想知道在XSLT中编写XPath的一般和可理解的方法,并发布了示例。
preceding-sibling::team[@area='Tokyo']/staff[1]
<sales_division>
  <team area="New York">
    <staff>John</staff>
  </team>
  <team area="Tokyo">
    <staff>Sato</staff>
    <staff>Tanaka</staff>
  </team>
  <staff />
  <team area="Osaka">
    <staff>Ueda</staff>
    <staff>Suzuki</staff>
  </team>
</sales_division>