Xml 我应该使用哪一个:前置::还是前置同级::?
我正在犹豫是否要在XSL中编写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
前置
或前置同级
,例如下面的示例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”
staff
中的文本节点位于staff
子节点之前,子节点位于team
兄弟节点之前)
你在问:
- 取前面所有与
匹配的节点,即空节点、田中节点、佐藤节点和约翰节点(按顺序)staff
- 选择找到的第二个
- 在增强XML中,这将选择Tanaka
。
是父节点()
的缩写。它意味着获取当前节点的父节点(即根元素销售部门
)
你在问:
- 转到母公司
销售部门
- 从那里往下走,找到第一个匹配的孩子
团队
- 从那里找到第一个匹配
staff
- 在增强XML中,这是John
实际上,我更经常地看到,您需要在当前节点之前或之后具有同级的元素。在这种情况下,
。
(父)语法可能是最好的方法,可能会将当前节点从节点集中排除。这在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>