【问题标题】:How to create contents nodes out of an empty tokenized string in XSLT?如何从 XSLT 中的空标记化字符串创建内容节点?
【发布时间】:2014-07-08 04:27:07
【问题描述】:

我的应用程序没有为空的标记化字符串创建内容节点,所以我想知道是应用程序还是 xslt 中的东西我搞砸了。

我在表格行中有一个字符串,例如:

|0001|联合健康基金会|10 Circle LN||纽约|纽约|

像这样

|0002|红十字会|20 Bender LN|Suite 20|纽约|NY|

所以我在'|'上进行标记

<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 具有城市价值,城市价值具有州价值,依此类推。

有人可以推荐一种方法来解决这个问题吗?或者这很可能是我的应用程序中的问题?

感谢您的帮助

【问题讨论】:

  • 也许我遗漏了一些东西......“str”前缀与什么命名空间相关联?另外,这是 XSL 1.0 还是 2.0? (这将有助于查看顶级 xsl:stylesheetxsl:transform 元素)
  • EXSLT 标记化函数中有一个会跳过空白结果的怪癖。该函数的代码在这里,如果您想亲自查看:exslt.org/str/functions/tokenize/str.tokenize.function.xsl。您可以推断该代码,或者从 michael 的答案中推断代码。

标签: xml xslt


【解决方案1】:

这就是 str:tokenize() 函数的工作原理。如果您想要不同的结果,请改用递归模板 - 例如,请参阅: How to split string in XML

【讨论】:

    【解决方案2】:

    您似乎在使用 EXSLT 扩展函数 str:tokenize 而不是 XPath 2.0 函数 fn:tokenize()。如果您使用 fn:tokenize(),我认为您的代码会执行预期的操作。我很惊讶你的 str:tokenize() 实现是这样的,但它是相当非正式地指定的,并且没有一致性测试,所以你在选择实现时很不走运。

    请注意,在 XPath 2.0 正则表达式(定义为 fn:tokenize())中,"|"需要转义为 "\|"

    【讨论】:

      猜你喜欢
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多