You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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>&#10;</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>&#10;</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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:23:36