【问题标题】:XSLT: How to check every node with if statement from looped elementsXSLT:如何使用循环元素中的 if 语句检查每个节点
【发布时间】:2014-10-02 12:16:53
【问题描述】:

我有三个同名的元素。其中一些具有合理的价值,其中一些具有换行作为价值或根本没有价值。我只需要打印具有合理值的那些,而不是具有换行符或空值的那些。我该怎么做?

XML:

<givenNames>
    <givenName>Name1</givenName>
    <givenName>Name2</givenName>
    <givenName></givenName>
</givenNames>

XSLT:

<xsl:for-each select="givenNames/givenName">
    <xsl:if test="string-length(../givenName) > 1">
        <xsl:value-of select="."/>
        <xsl:text>, </xsl:text>
    </xsl:if>
</xsl:for-each>

if 语句只检查第一个节点,如果有值,则打印每个节点。如何检查每个节点是否应该打印?

【问题讨论】:

    标签: xml xslt if-statement for-loop xmlnode


    【解决方案1】:

    把你的select表达式改成:

    select="givenNames/givenName[normalize-space()]"
    

    只处理“合理”(即包含一些非空白字符)值。

    【讨论】:

      【解决方案2】:

      实际上,我刚刚发现稍微更改 if 语句对我的情况有用。

      before
        <xsl:if test="string-length(../givenName) > 1">
      after
        <xsl:if test="string-length(.) > 1">
      

      我不知道为什么这样有效,但它有效:)

      【讨论】:

      • 你的方法的问题是它会消除&lt;givenName&gt;a&lt;/givenName&gt;,但会传递一个由两个空格组成的名称(除非你有xsl:strip-space首先处理)。
      【解决方案3】:

      试试看:

      <xsl:if test="givenName != ''">
      

      享受您的代码!

      【讨论】:

      • 感谢您的帮助!问题是有时我不想打印换行符。否则,如果我知道节点将为空,我会使用它。
      • 因此您可以在测试前尝试删除换行符。 xmlplease.com/whitespace 类似这样的东西: translate(description, '#xD; ', ' ') 或 replace() 如果是 XSLT 2。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      • 2016-04-10
      • 1970-01-01
      相关资源
      最近更新 更多