使用xsltproc提取XML中urc的name与job的run值失败求助
问题排查与正确实现方案
场景示例明确
示例XML输入
<root> <urc name="URC-001"> <job run="daily_backup.sh"/> <job run="log_rotate.sh"/> </urc> <urc name="URC-002"> <job run="db_sync.sh"/> </urc> </root>
期望输出
URC-001: daily_backup.sh URC-001: log_rotate.sh URC-002: db_sync.sh
常见失败原因及修复
原因1:XPath路径层级错误
多数失败案例是XSLT中的节点选择路径未匹配XML的层级结构,比如直接写select="job",但job是urc的子节点,urc又嵌套在root下,路径不完整会导致无法匹配到目标节点。
原因2:忽略XML命名空间
若XML带有默认命名空间(如xmlns="http://your-namespace.com"),XSLT必须声明对应的命名空间前缀,否则XPath无法识别节点。
正确XSLT实现方案
无命名空间的XML适配版本
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <!-- 遍历所有urc下的job节点 --> <xsl:for-each select="root/urc/job"> <!-- 取父节点urc的name属性 --> <xsl:value-of select="../@name"/> <xsl:text>: </xsl:text> <!-- 取当前job的run属性 --> <xsl:value-of select="@run"/> <!-- 添加换行符 --> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
带命名空间的XML适配版本
如果你的XML带有默认命名空间(示例如下):
<root xmlns="http://example.com/urc-namespace"> <urc name="URC-001"> <job run="daily_backup.sh"/> </urc> </root>
对应的XSLT需要声明命名空间前缀并使用:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:urcns="http://example.com/urc-namespace"> <xsl:template match="/"> <xsl:for-each select="urcns:root/urcns:urc/urcns:job"> <xsl:value-of select="../@name"/> <xsl:text>: </xsl:text> <xsl:value-of select="@run"/> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
执行命令
将XSLT保存为extract_urc_job.xsl,XML保存为input.xml,执行以下命令:
xsltproc extract_urc_job.xsl input.xml
内容的提问来源于stack exchange,提问作者iamsage
相关产品推荐
相关产品推荐

