XSLT统计第一个<b>容器下的<c>节点数量问题
解决第一个
<b>容器内<c>节点的统计问题 嘿,刚学XML两天就能上手尝试XSLT统计已经超棒啦!别担心表述的问题,咱们一步步来搞定你的需求~
首先明确你的核心目标:只统计第一个<b>节点下的所有<c>节点数量,而不是所有<b>容器里的总和。你当前用的count(RatedShipment/RatedPackage)会统计所有RatedShipment下的RatedPackage,这就是结果不符合预期的原因。
正确的XPath表达式写法
要实现只统计第一个容器内的节点,你需要用XPath的**位置谓词[1]**来定位到第一个RatedShipment(也就是你说的<b>容器),然后再统计它下面的RatedPackage(<c>节点)。
正确的表达式应该是:
count(RatedShipment[1]/RatedPackage)
如果你的XML结构有根节点(比如<root>或者<Shipment>),记得把根节点路径加上,避免上下文出错:
count(/Shipment/RatedShipment[1]/RatedPackage)
几个需要注意的坑
- 大小写敏感:XML节点名是区分大小写的,比如
ratedShipment和RatedShipment是完全不同的节点,一定要确保表达式里的节点名和XML里的完全一致。 - 命名空间问题:如果你的XML里带有命名空间(比如开头有
xmlns="http://your-namespace.com"),那你需要在XSLT里绑定命名空间前缀,再用前缀来访问节点。例如:<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://your-namespace.com"> <xsl:template match="/"> <xsl:value-of select="count(ns:Shipment/ns:RatedShipment[1]/ns:RatedPackage)"/> </xsl:template> </xsl:stylesheet> - 上下文节点:如果你的
<xsl:value-of>是在某个子模板里,要注意当前的上下文是不是根节点。如果不是,记得用绝对路径(以/开头)或者相对路径调整,避免选到错误的节点。
完整示例
假设你的XML结构是这样的:
<Shipment> <RatedShipment> <RatedPackage>包裹1</RatedPackage> <RatedPackage>包裹2</RatedPackage> <RatedPackage>包裹3</RatedPackage> </RatedShipment> <RatedShipment> <RatedPackage>包裹4</RatedPackage> </RatedShipment> </Shipment>
对应的XSLT代码可以写成:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <第一个包裹容器的数量> <xsl:value-of select="count(Shipment/RatedShipment[1]/RatedPackage)"/> </第一个包裹容器的数量> </xsl:template> </xsl:stylesheet>
运行这个XSLT后,会输出<第一个包裹容器的数量>3</第一个包裹容器的数量>,正好是第一个RatedShipment里的RatedPackage数量。
内容的提问来源于stack exchange,提问作者Alith7
相关产品推荐
相关产品推荐

