使用应用模板时如何在xslt中的选择条件中使用两个条件

使用应用模板时如何在xslt中的选择条件中使用两个条件,xslt,xpath,Xslt,Xpath,为什么我不能在上面的选择条件中使用两个条件,任何一个都可以建议我吗。如果失败并出现错误,请告诉我们错误。如果它没有选择您想要的内容,那么(a)向我们显示您的源文档,以及(b)告诉我们您想要选择的内容 (你知道,你的问题提供的信息太少,你不会给人留下你真的想要答案的印象。)你可以使用两个条件,你的表达式看起来完全正确。如果失败并出现错误,请告诉我们错误。如果它没有选择您想要的内容,那么(a)向我们显示您的源文档,以及(b)告诉我们您想要选择的内容 (你知道,你的问题提供的信息太少,你不会给人留下你

为什么我不能在上面的选择条件中使用两个条件,任何一个都可以建议我吗。如果失败并出现错误,请告诉我们错误。如果它没有选择您想要的内容,那么(a)向我们显示您的源文档,以及(b)告诉我们您想要选择的内容


(你知道,你的问题提供的信息太少,你不会给人留下你真的想要答案的印象。)

你可以使用两个条件,你的表达式看起来完全正确。如果失败并出现错误,请告诉我们错误。如果它没有选择您想要的内容,那么(a)向我们显示您的源文档,以及(b)告诉我们您想要选择的内容

(你知道,你的问题提供的信息太少,你不会给人留下你真的想要答案的印象。)

与上面的第一个表达式完全不等价

第一个表达式选择
新数据集的第一个
子项
,使其
CTD_CTD_PKG_ID
子项的字符串值等于
$PackageId
的字符串值。在这种情况下,我们不知道将选择
NewDataSet
的哪个子级(在哪个位置)——将选择恰好是第一个具有指定属性的子级

另一方面,只有当其
CTD\u CTD\u PKG\u ID
子级的字符串值等于
$PackageId
的字符串值时,后一个表达式才会选择
新数据集的第一个
子级。在这种情况下,如果选择了任何内容,它将是第一个
子项

如果需要与第一个表达式等价的表达式,且该表达式只有一个谓词,则此类表达式之一是:

NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId and position() = 1]
更新:OP发布了一段代码片段:

我的第二个猜测是,您希望模板仅应用于两个节点中的第一个节点。如果是这样,则使用:

 <xsl:apply-templates mode="block2sequence" select=
    "NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId][position()=1]
    and
     NewDataSet/Table[CTD_SEQ_NUM =$strXSLMsgType][position()=1]"/>
 <xsl:apply-templates mode="block2sequence" select=
    "NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId][1]
    |
     NewDataSet/Table[CTD_SEQ_NUM =$strXSLMsgType][1]"/>

注释

<xsl:apply-templates mode="block2" 
     select="NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId][position()=1] "/>
  • 请学习如何在问题中提问——提供所有相关数据并解释——而不是在随后的评论中

  • 您是否知道
    [1]
    相当于
    [position()=1]
    ,并且更短

  • 与上面的第一个表达式完全不等价

    第一个表达式选择
    新数据集的第一个
    子项
    ,使其
    CTD_CTD_PKG_ID
    子项的字符串值等于
    $PackageId
    的字符串值。在这种情况下,我们不知道将选择
    NewDataSet
    的哪个子级(在哪个位置)——将选择恰好是第一个具有指定属性的子级

    另一方面,只有当其
    CTD\u CTD\u PKG\u ID
    子级的字符串值等于
    $PackageId
    的字符串值时,后一个表达式才会选择
    新数据集的第一个
    子级。在这种情况下,如果选择了任何内容,它将是第一个
    子项

    如果需要与第一个表达式等价的表达式,且该表达式只有一个谓词,则此类表达式之一是:

    NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId and position() = 1]
    
    更新:OP发布了一段代码片段:

    我的第二个猜测是,您希望模板仅应用于两个节点中的第一个节点。如果是这样,则使用:

     <xsl:apply-templates mode="block2sequence" select=
        "NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId][position()=1]
        and
         NewDataSet/Table[CTD_SEQ_NUM =$strXSLMsgType][position()=1]"/>
    
     <xsl:apply-templates mode="block2sequence" select=
        "NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId][1]
        |
         NewDataSet/Table[CTD_SEQ_NUM =$strXSLMsgType][1]"/>
    
    
    
    注释

    <xsl:apply-templates mode="block2" 
         select="NewDataSet/Table[CTD_CTD_PKG_ID =$PackageId][position()=1] "/>
    
  • 请学习如何在问题中提问——提供所有相关数据并解释——而不是在随后的评论中

  • 您是否知道
    [1]
    相当于
    [position()=1]
    ,并且更短


  • 这还不清楚:您想要实现什么,您想要选择什么,这是您无法指定的两个条件(在上面的
    select
    属性中,您实际上指定了两个条件)。因为这样我们在match=“X和y”中使用的是类似的,当我在这里做的时候,它是这样说的wrong@_pravz:最好编辑你的问题并描述好问题所在。你的评论仍然让人困惑。@DimitreNovatchev是的,我已经编辑了模板,它抛出了错误,你能帮我吗suggest@DimitreNovatchev我在select中有两个使用条件,因为在所有新数据集/表PackageId中都有$PackageId和$PackSEQ,它们将是相同的,而PackSEQ将有所不同,因此通过使用两个条件,我的问题将得到解决当我试图更新APPLY TEMPLATE SELECT中的两个条件时,出现了一个错误,但我不清楚:您想要实现什么,您想要选择什么,这两个条件是您无法指定的(在上面的
    SELECT
    属性中,您实际指定了两个条件)。因为这样我们在match=“X和y”中使用的是类似的,当我在这里做的时候,它是这样说的wrong@_pravz:最好编辑你的问题并描述好问题所在。你的评论仍然让人困惑。@DimitreNovatchev是的,我已经编辑了模板,它抛出了错误,你能帮我吗suggest@DimitreNovatchev我在select中有两个使用条件,因为在所有新数据集/表PackageId中都有$PackageId和$PackSEQ,它们将是相同的,而PackSEQ将有所不同,因此通过使用两个条件,我的问题将得到解决当我试图更新APPLY TEMPLATE SELECT中的两个条件时,出现了一个错误,请建议meExpression必须计算到一个节点集。-->NewDataSet/Table…][position()=1]表达式必须计算为节点集。-->NewDataSet/表…][position()=1]