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

使用XSL将复杂XML转换为简化XML时输出不符合预期如何解决

问题原因

转换结果不符合预期有三个核心原因:

  1. 源XML带有默认命名空间http://www.abbyy.com/FineReader_xml/FineReader10-schema-v1.xml,未绑定前缀的XPath路径无法匹配到带命名空间的源节点,导致读取不到blockType属性和文本内容
  2. XSL样式表根节点声明了和源文件一致的默认命名空间,会导致输出XML也携带多余的命名空间声明
  3. 文本取值路径错误,源文件的实际文本存放在line节点的formatting子节点中,原路径直接取line无法拿到正确文本

修改后的完整XSL代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"  
    xmlns:abbyy="http://www.abbyy.com/FineReader_xml/FineReader10-schema-v1.xml"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    exclude-result-prefixes="abbyy">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <document>
            <page>
                <block>
                    <xsl:variable name="blockType" select="/abbyy:document/abbyy:page/abbyy:block/@blockType"/>
                    <xsl:attribute name="blockType">
                        <xsl:value-of select="$blockType"/>
                    </xsl:attribute>
                    <text>
                        <xsl:for-each select="/abbyy:document/abbyy:page/abbyy:block/abbyy:text/abbyy:par">
                            <paragraph>
                                <line>
                                    <xsl:value-of select="./abbyy:line/abbyy:formatting"/>
                                </line>
                            </paragraph>
                        </xsl:for-each>
                    </text>
                </block>
            </page>
        </document>
    </xsl:template>
</xsl:stylesheet>

修改说明

  • 给源文件的命名空间绑定了abbyy前缀,所有XPath路径都加上此前缀,即可正确匹配源文档中的节点
  • 移除了样式表中不必要的默认命名空间、xsi命名空间声明,避免输出携带多余属性
  • 新增exclude-result-prefixes="abbyy"配置,避免自定义的命名空间前缀被输出到最终结果中
  • 修正了文本取值路径,适配源文件的节点层级,可正确读取每一行的文本内容

内容的提问来源于stack exchange,提问作者shashi sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 15:06:06