【问题标题】:xslt object tree create structurexslt对象树创建结构
【发布时间】:2013-11-14 15:24:44
【问题描述】:
papa francesco rossi; figlio giuseppe rossi; nipote bartolomeo rossi

我想用“;”分割这条记录并数“;”人物

你能给出一些关于这个的说明吗?

我记得在 Visual Basic 中存在 SPLIT 函数....听起来很熟悉??谢谢。

<familiari>papa francesco rossi; figlio giuseppe rossi; nipote bartolomeo rossi</familiari>

在输出中我想要:

; ;尼波特·巴托洛梅奥·罗西
这是我的 xml 代码:

<p>
   <FAMILIARI>papa francesco rossi; figlio giuseppe rossi; nipote bartolomeo rossi</FAMILIARI>
   <FAMILIARI>papa francesco rossi; figlio giuseppe rossi; nipote giuseppe contarino</FAMILIARI>
   <FAMILIARI>papa francesco rossi; figlio giuseppe rossi; nipote antonio mazzarino</FAMILIARI>
</p>

我想在输出中使用这个结构:

-papafrancesco rossi
--figlio giuseppe rossi
---nipote bartolomeo rossi
---nipote giuseppe contarino
---nipote antonio mazzarino

【问题讨论】:

  • 欲了解更多信息,请直接链接到昨天的this question。不幸的是,我无法提供帮助,因为我不确定您如何做到这一点。另外,@franscescoi,你复制了这个问题,并给出了两个不同的输出——我昨天回答的第一个输出
  • 它对我来说是必需的,例如:我有这个结构 papa francesco rossi 的 thipe;菲利奥·朱塞佩·罗西; nipote bartolomeo ////papa francesco rossi;菲利奥·朱塞佩·罗西; nipote peppino ///papa francesco rossi;菲利奥·朱塞佩·罗西; nipote carmelo ...您可以看到更改了最后一个元素,但另一个相同。请查看新请求。
  • 是的,我改变了输出,因为我出现了类似的错误......我没有给出所有......有必要了解问题

标签: xslt xslt-1.0


【解决方案1】:

以@freefaller 为您所做的 previous question 为基础。这是我想出的:

<xsl:call-template name="getFinalText">
  <xsl:with-param name="text" select="text()"/>
  <xsl:with-param name="prev_text" select="preceding-sibling::familiari[1]"/>
  <xsl:with-param name="iteration" select="1"/>
</xsl:call-template>

这是它调用的模板。

<xsl:template name="getFinalText">
  <xsl:param name="text"/>
  <xsl:param name="prev_text"/>
  <xsl:param name="iteration"/>
  <xsl:choose>
    <xsl:when test="contains($text,';')">
      <xsl:if test="not(substring-before($text,';')=substring-before($prev_text,';'))">
        <xsl:call-template name="semicolon">
          <xsl:with-param name="count" select="0"/>
          <xsl:with-param name="iteration" select="$iteration"/>
        </xsl:call-template>
        <xsl:value-of select="substring-before($text,';')"/>
        <xsl:text xml:space="preserve">&#10;</xsl:text>
      </xsl:if>
      <xsl:call-template name="getFinalText">
        <xsl:with-param name="text" select="substring-after($text,';')"/>
        <xsl:with-param name="prev_text" select="substring-after($prev_text,';')"/>
        <xsl:with-param name="iteration" select="$iteration + 1"/>
      </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:call-template name="semicolon">
        <xsl:with-param name="count" select="0"/>
        <xsl:with-param name="iteration" select="$iteration"/>
      </xsl:call-template>
      <xsl:value-of select="$text"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

这是分号模板。

<xsl:template name="semicolon">
  <xsl:param name="count"/>
  <xsl:param name="iteration"/>
  <xsl:if test="$count &lt; $iteration">
    <xsl:text>;</xsl:text>
    <xsl:call-template name="semicolon">
      <xsl:with-param name="count" select="$count + 1"/>
      <xsl:with-param name="iteration" select="$iteration"/>
    </xsl:call-template>
  </xsl:if>
</xsl:template>

这在 XML Playground 上对我有用。顺便说一句,感谢@freefaller 在上一个问题中提到它。这对我来说是新的,非常有用。

【讨论】:

  • 您有电子邮件可以帮助我完成项目的简单功能吗?
  • 像@freefalling 一样,我宁愿不公开我的电子邮件。最好添加一个问题。您可以在评论中链接到它,我可以尝试提供帮助。
猜你喜欢
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多