如何从含XSL内容的XML文件提取数据及用Pentaho获取XSL中的日期
问题1:如何从包含XSL内容的XML文件中提取数据?
首先得搞清楚你的XML文件里XSL内容是怎么存在的——是内嵌了完整的XSLT样式表,还是通过<?xml-stylesheet?>指令引用了外部XSL,甚至是XML的某些节点里直接存了XSL代码?不同情况处理方式略有不同,这里给你几个实用的思路:
用XPath精准定位过滤XSL节点:如果XSL是作为XML里的独立节点(比如
<xsl:stylesheet>或者自定义的<xsl-content>块)存在,完全可以用XPath跳过这些XSL节点,直接抓业务数据。举个例子,如果你的XML结构是这样的:<root> <business-records> <order id="1">...</order> </business-records> <xsl:stylesheet version="1.0"> <!-- 这里是XSL代码 --> </xsl:stylesheet> </root>那直接用
/root/business-records//*这样的XPath就能提取所有业务数据,XSL节点会被自动忽略。先清理XSL内容再解析:如果XSL内容和业务数据混在一起,或者你想彻底清理掉XML里的XSL代码,可以用编程语言的XML处理库来操作。比如用Python的
lxml库,先遍历XML删除所有XSL命名空间下的节点,再提取数据:from lxml import etree # 加载XML文件 tree = etree.parse('your-xml-file.xml') # 移除所有XSL命名空间的节点 for xsl_node in tree.xpath('//*[namespace-uri()="http://www.w3.org/1999/XSL/Transform"]'): xsl_node.getparent().remove(xsl_node) # 现在可以正常提取目标数据了 target_data = tree.xpath('//your-target-node/text()')忽略外部XSL引用:如果XML只是通过
<?xml-stylesheet type="text/xsl" href="xxx.xsl"?>引用了外部XSL,这个指令只是给浏览器看的,XML本身的业务数据是完整的,直接按普通XML的方式提取就行,完全不用管这个引用。
问题2:用Pentaho读取XML文件,部分日期数据来源于另一个XSL文件,怎么获取这些日期?
这种情况大概率是XML里的日期不是直接写死的,而是需要通过XSL的逻辑生成(比如XSL里定义了日期变量、用模板输出日期,或者XML里是占位符,得XSL转换后才会变成实际日期)。在Pentaho里可以这么处理:
先做XSLT转换,再读转换后的XML:
Pentaho自带XSLT Transformation步骤,专门用来做XML和XSL的转换。你可以先把原始XML和对应的XSL文件作为输入,用这个步骤生成包含实际日期的XML文件,然后再用XML Input步骤去提取日期。操作流程大概是:- 把XSLT Transformation步骤拖到你的转换里,配置好原始XML路径、XSL文件路径,再设置转换后XML的输出路径。
- 接着拖XML Input步骤,指向刚才生成的XML文件,用XPath定位到日期节点,就能拿到你要的日期数据了。
直接解析XSL文件拿日期:如果日期是硬编码在XSL里的(比如XSL里有
<xsl:variable name="order-date" select="'2024-05-20'" />),那你可以直接用XML Input步骤读取XSL文件(毕竟XSL本身也是XML格式),用XPath提取这个变量的值。比如用//xsl:variable[@name='order-date']/@select就能拿到带引号的日期,再处理掉引号就行。用自定义脚本处理动态日期:如果XSL里的日期是动态生成的(比如用XSLT的
current-date()函数计算),那你可以在Pentaho里用用户定义的Java类或者Python脚本步骤,调用XSLT处理器执行对应的逻辑,算出日期后再和XML数据合并。
内容的提问来源于stack exchange,提问作者Abhishek

