XSLT过滤器无法正常工作

时间:2017-12-20 22:37:25

标签: xml xslt xpath xslt-1.0

我的计数好了,但是当我进一步过滤到CODE ='A'或'B'时,我得到'C'以及NODE GUID =“2”。

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

非常感谢任何帮助。提前谢谢。

有关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 个答案:

答案 0 :(得分:0)

如果您只想计算ActivityCodeCodeTypeName = 'CODE'以及CodeValue = 'A'所有+1块的数量,请使用以下计数:

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

结果:

3

但是,如果您想要计算ActivityCodeCodeTypeName = 'CODE'CodeValue = 'A' NODE阻止GUID = '2'+1count(/NODEs/NODE[@GUID = '2']/NODEs/NODE[@GUID = '2']//ActivityCode[CodeTypeName = 'CODE' and CodeValue = 'A']) + 1 的所有2 块的数量如上所述)使用如下:

done

结果:

provider.addInteraction(interaction1)
    .then(() => provider.addInteraction(interaction2));
    .then(() => done());

答案 1 :(得分:0)

您的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的{​​{1}}子节点和{{1}有值'CODE'。不过,你应该能够更紧凑地表达同样的事情:

CodeValue

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