我有这个XML文件,想统计每个callNumber附加了多少个项目-如果我的数据格式正确,这是一个非常容易的任务:-(
问题是我想为其中一个创建密钥
a)整个callNumber(如果其中不包含空格),或者
b)如果callNumber中有空格,则空格之前的部分应将'12'包含在与'12 34'相同的键中
到目前为止,我拒绝的解决方案:
子字符串-无效,因为Callnumber的长度不同
空格前的子字符串-无效,因为某些callNumbers不包含空格。
这有可能吗,还是我的数据太怪异了?我只能使用XSL 1.0,没有扩展名
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="countitempercall.xsl"?>
<report>
<catalog>
<call>
<callNumber>12</callNumber>
<item>
<itemID>305810</itemID>
</item>
</call>
</catalog>
<catalog>
<call>
<callNumber>12 34</callNumber>
<item>
<itemID>305811</itemID>
</item>
</call>
</catalog>
<catalog>
<call>
<callNumber>567A89</callNumber>
<item>
<itemID>305812</itemID>
</item>
</call>
</catalog>
<catalog>
<call>
<callNumber>567A89 Abc</callNumber>
<item>
<itemID>305813</itemID>
</item>
<item>
<itemID>305814</itemID>
</item>
</call>
</catalog>
</report>
到目前为止我的样式表
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="shelf" match="call" use="callNumber"/>
<xsl:template match="/">
<callNumberUsage>
<xsl:for-each select="//call[generate-id(.)=generate-id(key('shelf', callNumber)[1])]">
<xsl:sort select="callNumber"/>
<callNumberline>
<callNumber><xsl:value-of select="callNumber"/></callNumber>
<numberOfItems><xsl:value-of select="count(key('shelf', callNumber)/item)"/></numberOfItems>
</callNumberline>
</xsl:for-each>
</callNumberUsage>
</xsl:template>
</xsl:stylesheet>
您可以substring-before
与组合使用,concat
以在末尾添加一个空格callNumber
<xsl:key name="shelf" match="call" use="substring-before(concat(callNumber, ' '), ' ')"/>
在电话号码有空格的情况下,第二个空格不会影响它。在没有空格的情况下,最终将根据需要获得整数。
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="shelf" match="call" use="substring-before(concat(callNumber, ' '), ' ')"/>
<xsl:template match="/">
<callNumberUsage>
<xsl:for-each select="//call[generate-id(.)=generate-id(key('shelf', substring-before(concat(callNumber, ' '), ' '))[1])]">
<xsl:sort select="callNumber"/>
<callNumberline>
<callNumber><xsl:value-of select="callNumber"/></callNumber>
<numberOfItems><xsl:value-of select="count(key('shelf', substring-before(concat(callNumber, ' '), ' '))/item)"/></numberOfItems>
</callNumberline>
</xsl:for-each>
</callNumberUsage>
</xsl:template>
</xsl:stylesheet>
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句