我有一个看起来像这样的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>
答案 0 :(得分:0)
XSLT是XML 本身。它必须遵守XML的语法规则。 _ZN7android8hardware6camera6common4V1_06helper16CameraParameters
和<
在XPath中是有效的运算符,但是如果在XML中使用它们,则必须对它们进行XML转义。
>
似乎您想根据<xsl:if test="$foo > 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) > 1">
do something different
</xsl:if>
</xsl:for-each>
的情况下做一件事,而在有多个<PARENT_TAG>
的情况下又想做另一件事,那么这将行不通。总有至少一个,这意味着第一个<xsl:if>
将始终运行。有几种解决方法:
您可以修改第一个<xsl:if>
条件,以明确排除存在多个<PARENT_TAG>
的情况。
最好是<xsl:choose>
而不是<xsl:if>
-确保先测试“多个”案例。
<xsl:for-each select="HIGHLEVEL_TAG">
<xsl:choose>
<xsl:if test="count(PARENT_TAG) > 1">
do something different
</xsl:if>
<xsl:if test="count(PARENT_TAG) = 1">
do something
</xsl:if>
</xsl:choose>
</xsl:for-each>
但实际上,处理此问题的惯用方式是使用模板-一种用于特定情况(有多个<PARENT_TAG>
),而一种通用模板则与所有其他情况匹配(0或1 <PARENT_TAG>
):
<xsl:template match="HIGHLEVEL_TAG[count(PARENT_TAG) > 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() > 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>
如果您不习惯用明确的法文散文来编写规范,那么通常通过一个示例来传达您的要求的一种好方法:向我们展示典型的输入和所需的输出。