【问题标题】:XPath/XSLT/Axes select all siblings including selfXPath/XSLT/Axes 选择所有兄弟姐妹,包括自己
【发布时间】:2014-12-10 15:46:41
【问题描述】:

在我看来,有一个简单的轴或其他东西可以选择所有兄弟姐妹的文本,包括自我,但我似乎找不到它。

XML:

<panelTabs>
 <field></field>
 <field></field>
</panelTabs>

我目前在&lt;xsl:template match="panelTabs/field&gt; 中,我需要在此模板中。我想检查每个&lt;field&gt; 中的所有值是否都是空的,我该怎么做?

编辑:
更具体一点。我希望我的 XSLT 是这样的:

<xsl:template match="panelTabs/field>
 <xsl:if test="allfieldshaventgottext = true">
  <p>All are empty</p>
 </xsl:if>
 <xsl:if test="thereisafieldwithtext = true">
  <p>There is a field with text</p>
 </xsl:if>
</xsl:template>

xsl:when 可以代替 xsl:if

编辑:
我创建了一个新的、更详细的问题。我在这里:XPath/XSLT select all siblings including self

【问题讨论】:

    标签: xml xslt xpath axes


    【解决方案1】:

    您可以使用../* 选择包括当前元素在内的所有同级元素(或使用../field 专门选择field 元素)。

    所以在你的情况下,你可以这样做:

    <xsl:template match="panelTabs/field">
     <xsl:if test="not(../field[normalize-space()])">
      <p>All are empty</p>
     </xsl:if>
     <xsl:if test="../field[normalize-space()]">
      <p>There is a field with text</p>
     </xsl:if>
    </xsl:template>
    

    Example with some non-blank

    Example with all blank

    但是,使用模式匹配会更惯用:

    <xsl:template match="panelTabs/field">
      <p>All are empty</p>
    </xsl:template>
    
    <xsl:template match="panelTabs[field[normalize-space()]]/field" priority="2">
      <p>There is a field with text</p>
    </xsl:template>
    

    Example with some non-blank

    Example with all blank

    如果您只想检查一次是否所有字段都为空,您可以这样做:

    <xsl:template match="panelTabs[not(field[normalize-space()])]">
      <p>All are empty</p>
    </xsl:template>
    
    <xsl:template match="panelTabs/field">
      <p><xsl:value-of select="." /></p>
    </xsl:template>
    
    <xsl:template match="panelTabs/field[not(normalize-space())]" priority="2" />
    

    【讨论】:

    • 第一个解决方案似乎不起作用。它什么也不返回,而它应该返回一些东西。我忘了说字段标签之间可能有空格。 &lt;field&gt; &lt;/field&gt;。我会尝试第二种解决方案。
    • 如果它们之间有空间,那么normalize-space() 会处理这个问题。 string() 不会。
    • 解决方案不起作用。问题是,它会返回两次&lt;p&gt;All are empty&lt;/p&gt;
    • @Grafit 对您提出的问题是正确的 - 模板为每个 field 触发一次,如果所有同级字段为空,则输出 &lt;p&gt;All are empty&lt;/p&gt;。如果您只希望 每个 panelTabs 一个“无”响应而不是每个字段一个,那么您需要将 if 移到另一个级别。
    • @Grafit 我的第二个例子有一个错误(模板的内容是向后的)。如果您只想显示一次“全部为空”,我已修改我的答案以显示如何执行此操作。
    【解决方案2】:

    如果您检查not(../field[not(normalize-space())]),那么您知道没有空字段或仅包含空格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 1970-01-01
      相关资源
      最近更新 更多