使用XSL将复杂XML转换为简化XML时输出不符合预期如何解决
问题原因
转换结果不符合预期有三个核心原因:
- 源XML带有默认命名空间
http://www.abbyy.com/FineReader_xml/FineReader10-schema-v1.xml,未绑定前缀的XPath路径无法匹配到带命名空间的源节点,导致读取不到blockType属性和文本内容 - XSL样式表根节点声明了和源文件一致的默认命名空间,会导致输出XML也携带多余的命名空间声明
- 文本取值路径错误,源文件的实际文本存放在
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
相关产品推荐
相关产品推荐

