我的应用程序没有为空标记化字符串创建内容节点,所以我想知道它是应用程序还是xslt中的某些内容我搞砸了。
我在表行中有一个字符串,如:
| 0001 | United Health Foundation | 10 Circle LN ||纽约| NY |
并且喜欢这个
| 0002 | Red Cross | 20 Bender LN | Suite 20 |纽约|纽约|
所以我在'|'
上进行了标记<xsl:template match="/">
<xsl:apply-templates select="//tr" />
</xsl:template>
<xsl:template match="tr">
<xsl:for-each select=".">
<xsl:variable name="part" select="str:tokenize(.,'|')" />
<document>
<content name="id">
<xsl:value-of select="$part[1]" />
</content>
<content name="bizName">
<xsl:value-of select="$part[2]" />
</content>
<content name="street1">
<xsl:value-of select="$part[3]" />
</content>
<content name="street2">
<xsl:value-of select="$part[4]" />
</content>
<content name="city">
<xsl:value-of select="$part[5]" />
</content>
<content name="state">
<xsl:value-of select="$part[6]" />
</content>
</document>
</xsl:for-each>
</xsl:template>
我遇到的问题是第一行的'street2'节点(||)有一个空字符串值。所以我的应用程序是向左推送一个位置,street2具有城市值,城市值具有状态值等等。
有人可以推荐一种方法来解决这个问题,还是我应用程序中最有可能的东西?
感谢您的帮助
答案 0 :(得分:0)
这就是str:tokenize()函数的工作原理。如果您想要不同的结果,请使用递归模板 - 例如,请参阅: How to split string in XML
答案 1 :(得分:0)
您似乎使用的是EXSLT扩展函数str:tokenize而不是XPath 2.0函数fn:tokenize()。如果您使用了fn:tokenize(),我认为您的代码将按预期执行。我很惊讶你的str:tokenize()的实现是这样的,但它是非常非正式地指定的,并且没有一致性测试,所以你选择的实现是不吉利的。
请注意,在XPath 2.0正则表达式中(如fn:tokenize()所定义),"|"
需要转义为"\|"
。