XML转CMIS无数据返回问题求助
我在做一个项目,需要用XSLT把XML文件转换成CMIS格式。在W3Schools这类XSLT编辑器里测试转换时,能正常返回所有数据,但把XSLT文件放到项目里使用时,却完全返回不了数据。已经尝试了很多方法,但还是卡在这里,希望有人能给我指个方向。
我的XML文件内容:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Metadata schemaUri="http://www.nationaalarchief.nl/ToPX/v2.3"> <Content> <ToPX xmlns="http://www.nationaalarchief.nl/ToPX/v2.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <aggregatie> <identificatiekenmerk>Test</identificatiekenmerk> <aggregatieniveau>Test</aggregatieniveau> <naam>Test</naam> <omschrijving>Test</omschrijving> <plaats>Test</plaats> <eventGeschiedenis> <datumOfPeriode> <periode> <begin> <datum>2023-01-01</datum> </begin> <eind> <datum>2023-12-31</datum> </eind> </periode> </datumOfPeriode> <type>Test</type> <verantwoordelijkeFunctionaris>Test</verantwoordelijkeFunctionaris> </eventGeschiedenis> </aggregatie> </ToPX> </Content> </Metadata>
我的XSLT文件内容:
<?xml version="1.0" encoding="utf-8" standalone="yes"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ToPX="http://www.nationaalarchief.nl/ToPX/v2.3" exclude-result-prefixes="ToPX"> <xsl:template match="//ToPX:aggregatie"> <item> <name>Identificatiekenmerk</name> <xsl:apply-templates select="ToPX:identificatiekenmerk" /> </item> <item> <name>Aggregatieniveau</name> <xsl:apply-templates select="ToPX:aggregatieniveau"/> </item> <item> <name>Naam</name> <xsl:apply-templates select="ToPX:naam"/> </item> <item> <name>Omschrijving</name> <xsl:apply-templates select="ToPX:omschrijving"/> </item> <item> <name>Plaats</name> <xsl:apply-templates select="ToPX:plaats"/> </item> <group> <title>Kenmerken</title> <item> <name>Begindatum:</name> <xsl:apply-templates select="ToPX:eventGeschiedenis/ToPX:datumOfPeriode/ToPX:periode/ToPX:begin/ToPX:datum"/> </item> <item> <name>Einddatum:</name> <xsl:apply-templates select="ToPX:eventGeschiedenis/ToPX:datumOfPeriode/ToPX:periode/ToPX:eind/ToPX:datum"/> </item> <item> <name>Type</name> <xsl:apply-templates select="ToPX:eventGeschiedenis/ToPX:type"/> </item> <item> <name>Verantwoordelijke functionaris</name> <xsl:apply-templates select="ToPX:eventGeschiedenis/ToPX:verantwoordelijkeFunctionaris"/> </item> </group> </xsl:template> </xsl:stylesheet>
可能的问题方向及解决建议:
缺少根节点匹配模板
你的XSLT只定义了匹配//ToPX:aggregatie的模板,但没有匹配XML根节点(/)的模板。有些XSLT处理器可能不会自动递归触发深层元素的模板,尤其是当中间有非命名空间元素(比如<Metadata>和<Content>)时。建议添加一个根模板,明确触发对目标元素的处理:<xsl:template match="/"> <!-- 明确定位到aggregatie元素 --> <xsl:apply-templates select="Metadata/Content/ToPX:ToPX/ToPX:aggregatie"/> </xsl:template>XSLT版本兼容性问题
你的XSLT声明的是version="2.0",但如果你的项目使用的是只支持XSLT 1.0的处理器(比如Java中的Xalan,.NET中的默认处理器),可能会导致异常或不生效。可以尝试把版本改成1.0(因为你的代码没有用到XSLT 2.0的专属特性),或者确认项目中的XSLT处理器支持2.0版本。命名空间处理严格性差异
在线编辑器可能对命名空间的处理比较宽松,但项目中的处理器可能更严格。检查你的XPath路径是否完全正确:XML中<ToPX>元素本身也在目标命名空间下,所以完整路径是Metadata/Content/ToPX:ToPX/ToPX:aggregatie,你可以把模板匹配改成这个完整路径,避免//的模糊查找可能带来的问题。XML加载的编码或完整性问题
确认项目中加载XML文件时,编码设置正确(XML是UTF-8),并且文件没有损坏或被截断。有时候项目中读取文件的方式可能导致XML内容不完整,从而无法匹配到目标元素。默认模板的影响
XSLT的默认模板会处理文本节点,但如果你的项目处理器对命名空间元素的默认模板行为不同,可能导致没有触发你的自定义模板。添加根模板并明确apply-templates是解决这个问题的有效方式。
备注:内容来源于stack exchange,提问作者unseremutie

