xslt - 选择表亲 - 即前面和前面的兄弟姐妹的问题
问题描述
如果我有以下 xml
<root>
<house id="1">
<occupant>
</occupant>
<occupant>
</occupant>
</house>
<house id="2">
<occupant>
</occupant>
<occupant>
</occupant>
</house>
</root>
我想计算(计算不是问题,xpath 的构造是问题,我将在末尾附加一个更准确但更难解释的示例)在处理 xslt 时前面的“表兄弟”
和以下 xslt (1.0)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<counts>
<xsl:apply-templates select="root/house/occupant"/>
</counts>
</xsl:template>
<xsl:template match="occupant">
<previous>
<xsl:value-of select="count(preceding::occupant)"/>
</previous>
</xsl:template>
</xsl:stylesheet>
我得到我想要的
<counts>
<previous>0</previous>
<previous>1</previous>
<previous>2</previous>
<previous>3</previous>
</counts>
但如果居住者可以出现在 xml 树的其他位置,则这不起作用,例如
<root>
<house id="1">
<occupant>
</occupant>
<occupant>
</occupant>
<next_door>
<house id="2">
<occupant>
</occupant>
<occupant>
</occupant>
</house>
</next_door>
</house>
<house id="2">
<occupant>
</occupant>
<occupant>
</occupant>
</house>
</root>
我对“next_door”不感兴趣,实际上我只对树中的“堂兄弟”(和兄弟姐妹)感兴趣,即路径“根/房屋/居住者”上的东西
以上将计算任何居住者,而前面的兄弟姐妹将仅计算兄弟姐妹。
我觉得我想数数
/root/house/occupant[一些谓词说这个节点在当前节点之前]
PS 实际问题更像是这样,即从特定表亲中提取数据(但解释输出非常复杂,其中计数很好且易于解释)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<counts>
<xsl:apply-templates select="root/house/occupant"/>
</counts>
</xsl:template>
<xsl:template match="occupant">
<previous_and_next>
<previous>
<xsl:copy-of select="(preceding::occupant)[1]"/>
</previous>
<next>
<xsl:copy-of select="(following::occupant)[1]"/>
</next>
</previous_and_next>
</xsl:template>
</xsl:stylesheet>
解决方案
目前尚不清楚您到底想要什么。occupant
从路径的上下文中,/root/house/occupant
您可以使用以下命令选择同一路径上的先前居住者:
preceding-sibling::occupant | ../preceding-sibling::house/occupant"
推荐阅读
- c# - SignalR .NET Core:写入消息失败。中止连接。值不能为空。(参数“输入类型”)
- java - java postgresql 使用触发器
- c# - 使用 Knockout、MVC 和 Kendo 时,在控制器“Web.Controllers.HomeController”上找不到公共操作方法“未定义”。
- elixir - 从 Phoenix 视图返回多个标签
- php - 最小化连接数量的最佳方法是什么?
- html - 宽度没有按应有的方式工作(css / html)
- sdk - 是否可以为 VSTO 插件项目使用新的 SDK 样式的 .csproj 文件
- ampl - 在 AMPL 软件中编码
- javascript - 嵌套数组:如何正确使用 && 运算符来跳过一些循环?
- influxdb - Telegraf 1.16 + inputs.modbus 插件:超时问题