出站XML的XSLT转换失效排查及条件转换需求咨询
解决XSLT转换报错及添加条件判断的问题
咱们一步一步来搞定你的问题,先解决那个"No stylesheet associated to this object"的报错,再实现你要的0转false、1转true的逻辑。
一、排查报错原因
首先,这个报错大概率是在线测试工具没有正确关联你的XSLT和源XML文件,但咱们先确认你的XSLT本身有没有容易忽略的小问题:
你的源XML用了默认命名空间http://www.ibm.com/maximo,你在XSLT里给这个命名空间绑定了mea前缀,模板匹配的路径是对的,但有个关键细节:XML要求输出必须有单个根节点,你期望的结果是两个<PARAM>直接并列,这不符合XML规范,部分严格的测试工具会因此报错或无法正常处理。
我先给你修正XSLT,添加一个根节点(比如<PARAMS>)包裹所有输出,同时保留你的原有逻辑:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="mea" xmlns:mea="http://www.ibm.com/maximo"> <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="yes"/> <xsl:template match="/"> <!-- 添加根节点包裹所有PARAM,符合XML规范 --> <PARAMS> <xsl:apply-templates select="mea:PublishITEM"/> </PARAMS> </xsl:template> <xsl:template match="mea:PublishITEM"> <xsl:apply-templates select="mea:ITEMSet"/> </xsl:template> <xsl:template match="mea:ITEMSet"> <xsl:apply-templates select="mea:ITEM"/> </xsl:template> <xsl:template match="mea:ITEM"> <PARAM> <xsl:apply-templates select="mea:ATTACHONISSUE"/> </PARAM> </xsl:template> <xsl:template match="mea:ATTACHONISSUE"> <CD-NAME><xsl:value-of select="."/></CD-NAME> </xsl:template> </xsl:stylesheet>
如果换了这个XSLT还是报错,你可以检查下测试工具的操作细节:
- 确认是不是正确上传/选择了源XML和XSLT文件
- 有些工具要求XSLT必须带XML声明,上面的代码已经在开头添加了
<?xml version="1.0" encoding="UTF-8"?>,可以直接使用
二、添加条件判断逻辑
接下来实现你要的需求:当ATTACHONISSUE的值是0时输出false,是1时输出true。咱们修改mea:ATTACHONISSUE对应的模板,用<xsl:choose>做分支判断即可,还可以加个默认分支处理意外值:
完整的最终XSLT代码:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="mea" xmlns:mea="http://www.ibm.com/maximo"> <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="yes"/> <xsl:template match="/"> <PARAMS> <xsl:apply-templates select="mea:PublishITEM"/> </PARAMS> </xsl:template> <xsl:template match="mea:PublishITEM"> <xsl:apply-templates select="mea:ITEMSet"/> </xsl:template> <xsl:template match="mea:ITEMSet"> <xsl:apply-templates select="mea:ITEM"/> </xsl:template> <xsl:template match="mea:ITEM"> <PARAM> <xsl:apply-templates select="mea:ATTACHONISSUE"/> </PARAM> </xsl:template> <xsl:template match="mea:ATTACHONISSUE"> <CD-NAME> <xsl:choose> <xsl:when test=". = '0'">false</xsl:when> <xsl:when test=". = '1'">true</xsl:when> <!-- 如果有其他值,默认输出原内容,不需要的话可以删掉这个分支 --> <xsl:otherwise><xsl:value-of select="."/></xsl:otherwise> </xsl:choose> </CD-NAME> </xsl:template> </xsl:stylesheet>
最终转换结果
用这个XSLT处理你的源XML,会得到符合规范的XML输出:
<PARAMS> <PARAM> <CD-NAME>false</CD-NAME> </PARAM> <PARAM> <CD-NAME>true</CD-NAME> </PARAM> </PARAMS>
如果你确实不需要外层的<PARAMS>根节点(虽然不符合XML标准,但有些工具支持非规范输出),直接删掉<PARAMS>和对应的闭合标签即可,但还是建议保留它,避免后续出现兼容性问题。
内容的提问来源于stack exchange,提问作者Mircea
相关产品推荐
相关产品推荐

