代码之家  ›  专栏  ›  技术社区  ›  Jkoul

XSLT筛选器不工作

  •  -1
  • Jkoul  · 技术社区  · 7 年前

    我的计数很正常,但当我进一步过滤到代码=A或B时,对于节点GUID=2,我也会得到C。

    这看起来相当直截了当,但我不确定我做错了什么。

    任何帮助都将不胜感激。提前谢谢。

    有关XPATH表达式,请参见XSLT。

    这是我的XML:

    <?xml version="1.0" encoding="UTF-8"?>
    <NODEs>
        <NODE GUID="2">
            <Name>Michael</Name>
            <Activities/>
        <NODEs>
            <NODE GUID="1">
                <Name>Larry</Name>
                <ParentNODE>2</ParentNODE>
                <Activities>
                    <Activity GUID="A1">
                        <ActivityCodes>
                            <ActivityCode>
                                <CodeTypeName>CODE</CodeTypeName>
                                <CodeValue>A</CodeValue>
                            </ActivityCode>
                       </ActivityCodes>
                   </Activity>
               </Activities>
           </NODE>
           <NODE GUID="2">
               <Name>Joe</Name>
               <ParentNODE>2</ParentNODE>
               <Activities>
                  <Activity GUID="A2">
                  <NODECode>2</NODECode>
                  <ActivityCodes>
                      <ActivityCode>
                          <CodeTypeName>CODE</CodeTypeName>
                          <CodeValue>A</CodeValue>
                      </ActivityCode>
                  </ActivityCodes>
              </Activity>
              <Activity GUID="A3">
                  <NODECode>2</NODECode>
                  <ActivityCodes>
                      <ActivityCode>
                          <CodeTypeName>CODE</CodeTypeName>
                          <CodeValue>C</CodeValue>
                      </ActivityCode>
                  </ActivityCodes>
              </Activity>
              <Activity GUID="A4">
                 <NODECode>2</NODECode>
                 <ActivityCodes>
                     <ActivityCode>
                         <CodeTypeName>CODE</CodeTypeName>
                         <CodeValue>B</CodeValue>
                     </ActivityCode>
                 </ActivityCodes>
             </Activity>
          </Activities>
        </NODE>
       </NODEs>
      </NODE>
     </NODEs>
    

    这是相关的XSLT:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="2.0"
        xmlns:saxon="http://saxon.sf.net/"
        xmlns:PS="http://localhost"
        exclude-result-prefixes="saxon PS">
    
      <xsl:apply-templates select=".//Activity" mode="I_NODE">                
      </xsl:apply-templates>
    
      <xsl:template match="Activity" mode="I_NODE">
        <xsl:variable name="Code" select="ActivityCodes/ActivityCode[CodeTypeName = 'CODE']/CodeValue"/>  <!-- 'A'/'B' -->
    
        <xsl:if test="$Code = 'A' or $Code = 'B'">
          <NODE>
            <xsl:variable name="Count" select="count(preceding-sibling::*[$Code = 'A' or $Code = 'B'] ) +1"/>
            <xsl:value-of select="$Count"/>    
          </NODE>
        </xsl:if>
      </xsl:template>
    
    </xsl:stylesheet>
    

    电流输出:

    <NODE>1</NODE>
    <NODE>1</NODE>
    <NODE>3</NODE>
    

    预期输出:

    <NODE>1</NODE>
    <NODE>1</NODE>
    <NODE>2</NODE>
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   John Bollinger    7 年前

    您的XPath出现错误:

    count(preceding-sibling::*[ActivityCodes/ActivityCode[CodeTypeName = 'CODE']/CodeValue = 'A'] or [ActivityCodes/ActivityCode[CodeTypeName = 'CODE']/CodeValue = 'B'] ) +1
    

    看起来你是说 or 条件位于谓词内部而不是两个谓词之间:

    count(preceding-sibling::*[ActivityCodes/ActivityCode[CodeTypeName = 'CODE']/CodeValue = 'A' or ActivityCodes/ActivityCode[CodeTypeName = 'CODE']/CodeValue = 'B'] ) +1
    

    这将统计具有子代的上下文节点的所有先前同级 ActivityCodes/ActivityCode/CodeValue 其中 ActivityCode 有一个 CodeTypeName 有价值的孩子 'CODE' 以及 CodeValue 有价值 'B' . 不过,您应该能够更简洁地表达相同的内容:

    count(preceding-sibling::*[ActivityCodes/ActivityCode[CodeTypeName = 'CODE'][CodeValue = 'A' or CodeValue = 'B'] ) +1
    

    就我个人而言,我发现更紧凑的版本也更清晰。

        2
  •  0
  •   Alex Fomin    7 年前

    如果你只是想数一数 ActivityCode 块,其中 CodeTypeName = 'CODE' CodeValue = 'A' +1 然后使用如下计数:

    count(//ActivityCode[CodeTypeName = 'CODE' and CodeValue = 'A']) + 1
    

    结果:

    3
    

    但如果你想数一数 活动代码 块,其中 CodeTypeName='代码' CodeValue='A' 在里面 NODE 阻止位置 GUID = '2' +1 (如上)使用如下:

    count(/NODEs/NODE[@GUID = '2']/NODEs/NODE[@GUID = '2']//ActivityCode[CodeTypeName = 'CODE' and CodeValue = 'A']) + 1
    

    结果:

    2