如何在XSLT中用空标记化字符串创建内容节点?

时间:2014-07-08 04:27:08

标签: xml xslt

我的应用程序没有为空标记化字符串创建内容节点,所以我想知道它是应用程序还是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具有城市值,城市值具有状态值等等。

有人可以推荐一种方法来解决这个问题,还是我应用程序中最有可能的东西?

感谢您的帮助

2 个答案:

答案 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()所定义),"|"需要转义为"\|"