XSLT循环处理未知数量ItemOut元素及属性取值问题
XSLT遍历ItemOut元素无法获取属性值的解决方法
核心问题排查方向
1. 命名空间未正确绑定
如果源XML带有命名空间(比如xmlns="http://xxx.com/order"),XSLT里必须先声明该命名空间并使用前缀,否则XPath会找不到对应的元素。这是最常见的导致属性值为空的原因。
2. XPath路径错误
- 检查
xsl:for-each的select路径是否正确:比如当前上下文节点是<Header>,直接写ItemOut会找不到,需要用../ItemOut回到父节点,或者用绝对路径//ItemOut(带上命名空间前缀)。 - 确认路径里的元素名称和源XML完全一致(大小写敏感)。
3. 属性访问语法错误
获取属性必须用@属性名的写法,比如@Quantity,如果写成Quantity会当成子元素查找,自然返回空值。
示例演示
源XML(带命名空间)
<Order xmlns="http://example.com/order-system"> <OrderHeader> <OrderNo>SO-2024-0001</OrderNo> </OrderHeader> <ItemOut SKU="PROD001" Qty="3" UnitPrice="15.99"/> <ItemOut SKU="PROD002" Qty="1" UnitPrice="29.99"/> </Order>
错误的XSLT(未处理命名空间)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <ERPOrder> <OrderNumber><xsl:value-of select="Order/OrderHeader/OrderNo"/></OrderNumber> <OrderLines> <!-- 这里select路径没带命名空间,找不到ItemOut元素 --> <xsl:for-each select="Order/ItemOut"> <Line> <ProductCode><xsl:value-of select="@SKU"/></ProductCode> <Quantity><xsl:value-of select="@Qty"/></Quantity> </Line> </xsl:for-each> </OrderLines> </ERPOrder> </xsl:template> </xsl:stylesheet>
修正后的XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:os="http://example.com/order-system"> <!-- 声明命名空间并指定前缀os --> <xsl:template match="/"> <ERPOrder> <OrderNumber><xsl:value-of select="os:Order/os:OrderHeader/os:OrderNo"/></OrderNumber> <OrderLines> <!-- 用前缀os访问命名空间下的ItemOut元素 --> <xsl:for-each select="os:Order/os:ItemOut"> <Line> <ProductCode><xsl:value-of select="@SKU"/></ProductCode> <Quantity><xsl:value-of select="@Qty"/></Quantity> </Line> </xsl:for-each> </OrderLines> </ERPOrder> </xsl:template> </xsl:stylesheet>
预期输出
<ERPOrder> <OrderNumber>SO-2024-0001</OrderNumber> <OrderLines> <Line> <ProductCode>PROD001</ProductCode> <Quantity>3</Quantity> </Line> <Line> <ProductCode>PROD002</ProductCode> <Quantity>1</Quantity> </Line> </OrderLines> </ERPOrder>
内容的提问来源于stack exchange,提问作者jritt
相关产品推荐
相关产品推荐

