Xslt 阿尔托瓦';s和灶台';结果不一样
我有此表中的查找表,如果buyeritemcode=substring(字段[@id='0'],11,3),则取查找表中的subfamily=subfamily,否则取“9”:Xslt 阿尔托瓦';s和灶台';结果不一样,xslt,Xslt,我有此表中的查找表,如果buyeritemcode=substring(字段[@id='0'],11,3),则取查找表中的subfamily=subfamily,否则取“9”: <lookup> <Code> <BuyerItemCode>439</BuyerItemCode> <Subfamily>016</Subfamily> </Code>
<lookup>
<Code>
<BuyerItemCode>439</BuyerItemCode>
<Subfamily>016</Subfamily>
</Code>
</lookup>
439
016
Xml文件看起来:
<document>
<line id="14">
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
</line>
<line id="15">
<field id="0"><![CDATA[MMM4443 414390600000]]></field>
</line>
</document>
我需要将这个数据与lookup.xml进行比较,如果数据没有比较,则插入常量9。使用altova v11,我的程序可以运行,而使用cooktop则不行,我的意思是比较是错误的。
我的程序看起来:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://exslt.org/dates-and-times" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="date exsl">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="ProdSubfamily" match="Subfamily" use="../BuyerItemCode"/>
<xsl:template match="/">
<Interchange>
<Group>
<Message>
<xsl:if test="/document/line[(substring(field[@id='0'], 1,3)='MMM')]">
<xsl:apply-templates mode="MMM" select="/document"/>
</xsl:if>
</Message>
</Group>
</Interchange>
</xsl:template>
<xsl:template mode="MMM" match="/document">
<PriceCatalogue-Lines>
<xsl:for-each select="/document/line[contains(substring(field[@id='0'], 1,3),'MMM') and not(contains(substring(field[@id='0'],9,1),'0'))]">
<xsl:variable name="inputProd" select="substring(field[@id='0'], 11,3)"/>
<Line>
<Line-Item>
<LineNumber>
<xsl:value-of select="position()"/>
</LineNumber>
<BuyerItemCode>
<xsl:value-of select="substring(field[@id='0'], 11,3)"/>
</BuyerItemCode>
<SubFamily>
<xsl:choose>
<xsl:when test="substring(field[@id='0'], 11,3) = document('lookup.xml')/*/*/BuyerItemCode">
<xsl:for-each select="document('lookup.xml')">
<xsl:for-each select="key('ProdSubfamily',$inputProd)">
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'9'"/>
</xsl:otherwise>
</xsl:choose>
</SubFamily>
</Line-Item>
</Line>
</xsl:for-each>
</PriceCatalogue-Lines>
</xsl:template>
</xsl:stylesheet>
使用Altova获得的正确结果,我希望使用cooktop获得此结果:
<Interchange>
<Group>
<Message>
<PriceCatalogue-Lines>
<Line>
<Line-Item>
<LineNumber>1</LineNumber>
<BuyerItemCode>928</BuyerItemCode>
<SubFamily>9</SubFamily>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>2</LineNumber>
<BuyerItemCode>439</BuyerItemCode>
<SubFamily>016</SubFamily>
</Line-Item>
</Line>
</PriceCatalogue-Lines>
</Message>
</Group>
</Interchange>
1.
928
9
2.
439
016
我使用Cooktop的结果很糟糕:
<Interchange>
<Group>
<Message>
<PriceCatalogue-Lines>
<Line>
<Line-Item>
<LineNumber>1</LineNumber>
<BuyerItemCode>928</BuyerItemCode>
<SubFamily>9</SubFamily>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>2</LineNumber>
<BuyerItemCode>439</BuyerItemCode>
<SubFamily>9</SubFamily>
</Line-Item>
</Line>
</PriceCatalogue-Lines>
</Message>
</Group>
</Interchange>
1.
928
9
2.
439
9
问题出在源XML文档中:
<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
<Group>
<Message>
<PriceCatalogue-Lines>
<Line>
<Line-Item>
<LineNumber>1</LineNumber>
<BuyerItemCode>928</BuyerItemCode>
<SubFamily>9</SubFamily>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>2</LineNumber>
<BuyerItemCode>439</BuyerItemCode>
<SubFamily>016</SubFamily>
</Line-Item>
</Line>
</PriceCatalogue-Lines>
</Message>
</Group>
</Interchange>
CDATA部分包含一个不必要的[
字符,它是文本节点的第一个字符。这意味着:
substring(field[@id='0'], 1,3)='MMM'
总是false()
解决方案:
<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
<Group>
<Message>
<PriceCatalogue-Lines>
<Line>
<Line-Item>
<LineNumber>1</LineNumber>
<BuyerItemCode>928</BuyerItemCode>
<SubFamily>9</SubFamily>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>2</LineNumber>
<BuyerItemCode>439</BuyerItemCode>
<SubFamily>016</SubFamily>
</Line-Item>
</Line>
</PriceCatalogue-Lines>
</Message>
</Group>
</Interchange>
更换:
<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
<Group>
<Message>
<PriceCatalogue-Lines>
<Line>
<Line-Item>
<LineNumber>1</LineNumber>
<BuyerItemCode>928</BuyerItemCode>
<SubFamily>9</SubFamily>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>2</LineNumber>
<BuyerItemCode>439</BuyerItemCode>
<SubFamily>016</SubFamily>
</Line-Item>
</Line>
</PriceCatalogue-Lines>
</Message>
</Group>
</Interchange>
与:
<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
<Group>
<Message>
<PriceCatalogue-Lines>
<Line>
<Line-Item>
<LineNumber>1</LineNumber>
<BuyerItemCode>928</BuyerItemCode>
<SubFamily>9</SubFamily>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>2</LineNumber>
<BuyerItemCode>439</BuyerItemCode>
<SubFamily>016</SubFamily>
</Line-Item>
</Line>
</PriceCatalogue-Lines>
</Message>
</Group>
</Interchange>
同时替换:
<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
<Group>
<Message>
<PriceCatalogue-Lines>
<Line>
<Line-Item>
<LineNumber>1</LineNumber>
<BuyerItemCode>928</BuyerItemCode>
<SubFamily>9</SubFamily>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>2</LineNumber>
<BuyerItemCode>439</BuyerItemCode>
<SubFamily>016</SubFamily>
</Line-Item>
</Line>
</PriceCatalogue-Lines>
</Message>
</Group>
</Interchange>
与
<field id="0"><![CDATA[MMM4443 414390600000]]></field>
现在,不管使用的XSLT处理器是什么(我家里有9个XSLT处理器,可以在其中8个上运行:MSXML3/4、.NET XslCompiledTransform和XslTransform、AltovaXML、Saxon 6.5.4、Saxon 9.1.05和XQSharp),转换的结果都是您想要的
<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
<Group>
<Message>
<PriceCatalogue-Lines>
<Line>
<Line-Item>
<LineNumber>1</LineNumber>
<BuyerItemCode>928</BuyerItemCode>
<SubFamily>9</SubFamily>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>2</LineNumber>
<BuyerItemCode>439</BuyerItemCode>
<SubFamily>016</SubFamily>
</Line-Item>
</Line>
</PriceCatalogue-Lines>
</Message>
</Group>
</Interchange>
1.
928
9
2.
439
016
我猜Cooktop的XSLT处理器需要一些配置才能执行
document()
函数——研究可用的文档如何执行此操作。问题出在源XML文档中:
<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
<Group>
<Message>
<PriceCatalogue-Lines>
<Line>
<Line-Item>
<LineNumber>1</LineNumber>
<BuyerItemCode>928</BuyerItemCode>
<SubFamily>9</SubFamily>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>2</LineNumber>
<BuyerItemCode>439</BuyerItemCode>
<SubFamily>016</SubFamily>
</Line-Item>
</Line>
</PriceCatalogue-Lines>
</Message>
</Group>
</Interchange>
CDATA部分包含一个不必要的[
字符,它是文本节点的第一个字符。这意味着:
substring(field[@id='0'], 1,3)='MMM'
总是false()
解决方案:
<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
<Group>
<Message>
<PriceCatalogue-Lines>
<Line>
<Line-Item>
<LineNumber>1</LineNumber>
<BuyerItemCode>928</BuyerItemCode>
<SubFamily>9</SubFamily>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>2</LineNumber>
<BuyerItemCode>439</BuyerItemCode>
<SubFamily>016</SubFamily>
</Line-Item>
</Line>
</PriceCatalogue-Lines>
</Message>
</Group>
</Interchange>
更换:
<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
<Group>
<Message>
<PriceCatalogue-Lines>
<Line>
<Line-Item>
<LineNumber>1</LineNumber>
<BuyerItemCode>928</BuyerItemCode>
<SubFamily>9</SubFamily>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>2</LineNumber>
<BuyerItemCode>439</BuyerItemCode>
<SubFamily>016</SubFamily>
</Line-Item>
</Line>
</PriceCatalogue-Lines>
</Message>
</Group>
</Interchange>
与:
<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
<Group>
<Message>
<PriceCatalogue-Lines>
<Line>
<Line-Item>
<LineNumber>1</LineNumber>
<BuyerItemCode>928</BuyerItemCode>
<SubFamily>9</SubFamily>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>2</LineNumber>
<BuyerItemCode>439</BuyerItemCode>
<SubFamily>016</SubFamily>
</Line-Item>
</Line>
</PriceCatalogue-Lines>
</Message>
</Group>
</Interchange>
同时替换:
<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
<Group>
<Message>
<PriceCatalogue-Lines>
<Line>
<Line-Item>
<LineNumber>1</LineNumber>
<BuyerItemCode>928</BuyerItemCode>
<SubFamily>9</SubFamily>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>2</LineNumber>
<BuyerItemCode>439</BuyerItemCode>
<SubFamily>016</SubFamily>
</Line-Item>
</Line>
</PriceCatalogue-Lines>
</Message>
</Group>
</Interchange>
与
<field id="0"><![CDATA[MMM4443 414390600000]]></field>
现在,不管使用的XSLT处理器是什么(我家里有9个XSLT处理器,可以在其中8个上运行:MSXML3/4、.NET XslCompiledTransform和XslTransform、AltovaXML、Saxon 6.5.4、Saxon 9.1.05和XQSharp),转换的结果都是您想要的
<field id="0"><![CDATA[[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[MMM4443 419280600000]]></field>
<field id="0"><![CDATA[[MMM4443 414390600000]]></field>
<Interchange>
<Group>
<Message>
<PriceCatalogue-Lines>
<Line>
<Line-Item>
<LineNumber>1</LineNumber>
<BuyerItemCode>928</BuyerItemCode>
<SubFamily>9</SubFamily>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>2</LineNumber>
<BuyerItemCode>439</BuyerItemCode>
<SubFamily>016</SubFamily>
</Line-Item>
</Line>
</PriceCatalogue-Lines>
</Message>
</Group>
</Interchange>
1.
928
9
2.
439
016
我猜Cooktop的XSLT处理器需要一些配置才能执行
document()
函数——研究可用的文档如何执行此操作。Petras,您看到的输出可能意味着XSLT处理器无法找到lookup.xml文件
由于您使用的是相对URL('lookup.xml'),您知道基本URL是什么吗?换句话说,相对于什么
默认情况下,我相信使用的基本URL是样式表的URL。如果将第二个参数传递给document(),则可以显式设置基本URL。例如:
document('lookup.xml', /)
将查找相对于输入xml文件的“lookup.xml”
你可以通过提供一个指向“lookup.xml”的绝对URL来解决这个问题,或者至少找出问题所在。你为什么不试试,让我们知道它是否有效
document('/home/lars/lookup.xml')
或
p.S.XML Cooktop一直是一款很棒的软件,但它似乎很旧,现在显然没有维护。当出现故障时,这会成为一个问题。您可能希望尝试其他XSLT工具,如OxygenXML或StylusStudio,这些工具仍在维护中。Petras,您看到的输出可能意味着XSLT处理器无法运行查找lookup.xml文件 由于您使用的是相对URL('lookup.xml'),您知道基本URL是什么吗?换句话说,相对于什么 默认情况下,我相信使用的基本URL是样式表的URL。如果将第二个参数传递给document(),则可以显式设置基本URL。例如:
document('lookup.xml', /)
将查找相对于输入xml文件的“lookup.xml”
您可以通过提供一个指向“lookup.xml”的绝对URL来修复这个问题,或者至少找出问题是否出在哪里