如何在标签出现时使用XSLT中的大于函数

时间:2018-08-21 03:12:39

标签: xml xslt

我有一个看起来像这样的XSLT:

<xsl:if test="PARENT_TAG[1]">
do somthing
</xsl:if>

现在我还想对所有出现的大于1的PARENT_TAG做其他事情,例如:PARENT_TAG [2],PARENT_TAG [3],PARENT_TAG [4],PARENT_TAG [5] ........ 。PARENT_TAG [100]

可能是这样的:

<xsl:if test="PARENT_TAG[2-100]"> <!--need some logic here to capture all the parent_tags greater than "1"-->
do something different
</xsl:if>

如何在XSLT中应用此逻辑?请帮忙! 这两个条件都将在顶级逻辑共享同级关系内。像这样:

<xsl: for-each select="HIGHLEVEL_TAG">    
    <xsl:if test="PARENT_TAG[1]">
      do somthing
    </xsl:if>
    <xsl:if test="PARENT_TAG[2-100]"> <!--need some logic here to capture all the parent_tags greater than "1"-->
      do something different
    </xsl:if>
</xsl:for-each>

2 个答案:

答案 0 :(得分:0)

XSLT是XML 本身。它必须遵守XML的语法规则。 _ZN7android8hardware6camera6common4V1_06helper16CameraParameters<在XPath中是有效的运算符,但是如果在XML中使用它们,则必须对它们进行XML转义。

>

似乎您想根据<xsl:if test="$foo &gt; 1"> <!-- translates to '$foo > 1' during parsing of the XSLT document --> 元素的数量来决定要做什么。因此,让我们数一下。

<PARENT_TAG>

现在,如果您真的想在只有<xsl:for-each select="HIGHLEVEL_TAG"> <xsl:if test="count(PARENT_TAG) = 1"> do something </xsl:if> <xsl:if test="count(PARENT_TAG) &gt; 1"> do something different </xsl:if> </xsl:for-each> 的情况下做一件事,而在有多个<PARENT_TAG>的情况下又想做另一件事,那么这将行不通。总有至少一个,这意味着第一个<xsl:if>将始终运行。有几种解决方法:

  1. 您可以修改第一个<xsl:if>条件,以明确排除存在多个<PARENT_TAG>的情况。

  2. 最好是<xsl:choose>而不是<xsl:if>-确保先测试“多个”案例。

    <xsl:for-each select="HIGHLEVEL_TAG">
      <xsl:choose>
        <xsl:if test="count(PARENT_TAG) &gt; 1">
          do something different
        </xsl:if>
        <xsl:if test="count(PARENT_TAG) = 1">
          do something
        </xsl:if>
      </xsl:choose>
    </xsl:for-each>
    
  3. 但实际上,处理此问题的惯用方式是使用模板-一种用于特定情况(有多个<PARENT_TAG>),而一种通用模板则与所有其他情况匹配(0或1 <PARENT_TAG>):

    <xsl:template match="HIGHLEVEL_TAG[count(PARENT_TAG) &gt; 1]">
      do something different
    </xsl:template>
    
    <xsl:template match="HIGHLEVEL_TAG">
      do something
    </xsl:template>
    

现在您可以放下<xsl:for-each>并致电:

<xsl:apply-templates select="HIGHLEVEL_TAG" />

,XSLT处理器将为您解决问题。

如果不确定<xsl:apply-templates>的工作方式,请查看What are the differences between 'call-template' and 'apply-templates' in XSL?


同样的方法也适用于“我想对所有出现的<PARENT_TAG>大于一个的情况做其他事情” ,唯一的区别是我们使用{{1} },而不是position()来决定应该运行哪个模板:

count()

<xsl:template match="PARENT_TAG[position() &gt; 1]">
  do something different
</xsl:template>

<xsl:template match="PARENT_TAG">
  do something
</xsl:template>

答案 1 :(得分:0)

每个回答此问题的人似乎都在以不同的方式阅读您的要求,这表明您的问题存在清晰性的问题。

首先要说“我有一个看起来像这样的XSLT”,但您没有告诉我们它打算做什么,并且由于它很可能是错误的,因此我们无法从代码中推断出需求。 / p>

然后,您说“现在我还想对所有出现的PARENT_TAG大于1的情况也做其他事情”。这向我表明,第一部分代码仅用于处理第一个PARENT_TAG。

如果我的解释正确,那么您可能想要:

<xsl:for-each select="PARENT_TAG">
  <xsl:choose>
    <xsl:when test="position()=1"> do something </xsl:when>
    <xsl:otherwise> do something else </xsl:otherwise>
  </xsl:choose>
</xsl:for-each>

如果您不习惯用明确的法文散文来编写规范,那么通常通过一个示例来传达您的要求的一种好方法:向我们展示典型的输入和所需的输出。