我有这个XML文件,想要计算每个callNumber附加了多少项 - 如果我的数据格式正确,这是一个非常简单的任务: - (
问题是我想为
创建一个键a)整个callNumber,如果它不包含空格 或
b)如果callNumber中有空格,则空格前的部分 因此,'12'应与'12 34'
包含在同一个键中我到目前为止拒绝的解决方案:
substring - 不起作用,因为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>
答案 0 :(得分:1)
您可以将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>