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

XML转CMIS无数据返回问题求助

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 14:52:30