Dictionary XSLT1.0:计算匹配块的数量并创建映射

Dictionary XSLT1.0:计算匹配块的数量并创建映射,dictionary,xslt-1.0,counter,Dictionary,Xslt 1.0,Counter,我已经搜索过了,发现变量在XSLT中是不可变的(常量)。 我有两个问题。 给出了示例输入xml <employees> <!-- Block1 --> <employee> <id>123</id> <name>steve</name> <work>developer</work> </employee>

我已经搜索过了,发现变量在XSLT中是不可变的(常量)。 我有两个问题。
给出了示例输入xml

<employees>
    <!-- Block1 -->
    <employee>
        <id>123</id>
        <name>steve</name>
        <work>developer</work>
    </employee>
    <employee>
        <id>444</id>
        <name>mark</name>
        <work>developer</work>
    </employee>
    <employee>
        <id>444</id>
        <name>alex</name>
        <work>tester</work>
    </employee>
    <employee>
        <id>555</id>
        <name>john</name>
        <work>architect</work>
    </employee>
    <!-- Block 2-->
    <projects>
        <project>
            <pid>p2</pid>
            <roles>
                <role>developer</role>
                <role>tester</role>
            </roles>
            <total>30</total>
        </project>
        <project>
            <pid>p4</pid>
            <roles>
                <role>tester</role>
            </roles>
            <total>3</total>
        </project>
        <project>
            <pid>p3</pid>
            <roles>
                <role>architect</role>
            </roles>
            <total>2</total>
        </project>
    </projects>
</employees>

123
史提夫
开发商
444
做记号
开发商
444
亚历克斯
测试员
555
厕所
建筑师
p2
开发商
测试员
30
p4
测试员
3.
p3
建筑师
2.
输出:

情景(问题):2

部分:

<Projects>
        <pid>p2</pid>
        <employees>
            <empName>steve</empName>
            <empName>mark</empName>
            <empName>alex</empName>
        </employees>
    </Projects>

Not Part of : 

<Projects>
        <pid>p2</pid>
        <employees-exclude>
            <empName>john</empName>
        </employees-exclude>
    </Projects>

p2
史提夫
做记号
亚历克斯
不属于:
p2
厕所
情景(问题):3


p2
1.
史提夫
2.
做记号
3.
亚历克斯
问题:

  • 我可以创建一个维护所有员工详细信息的地图吗。(键为“工作”,值为id+姓名列表),是否可能? 输出:我想根据项目id准备emp列表。有一个逻辑。因此,我必须提前准备一份清单
  • 对于给定的项目id(pid),我希望获得所有根据工作(来自区块1)根据角色(区块2)选择的员工,以及不属于该项目的员工?投入将是 输出:

  • 要计算匹配的条目数?我们有“position()”,它告诉我们for循环中的当前迭代。但我只想要匹配的块。 例如,如果6个员工中有3个匹配。我需要附加值,例如,resource+unique-Id。unique-Id从“1”开始。 输出:


  • 非常感谢您的帮助和支持

    为了推进这一点,请尝试将此作为起点:

    XSLT1.0

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:key name="emp-by-work" match="employee" use="work" />
    
    <xsl:template match="/employees">
        <projects>
            <xsl:for-each select="projects/project">
                <xsl:variable name="emp-include" select="key('emp-by-work', roles/role)" />
                <project>
                    <xsl:copy-of select="pid"/>
                     <empList>
                        <xsl:for-each select="$emp-include">
                            <emp>
                                <resource>
                                    <xsl:value-of select="position()"/>
                                </resource>
                                <empName>
                                    <xsl:value-of select="name"/>
                                </empName>
                            </emp>
                        </xsl:for-each>
                     </empList>
                </project>
            </xsl:for-each>
        </projects>
    </xsl:template>
    
    </xsl:stylesheet>
    
    
    
    这将返回每个项目合格员工的编号列表-类似于您的#3场景:

    <?xml version="1.0" encoding="UTF-8"?>
    <projects>
      <project>
        <pid>p2</pid>
        <empList>
          <emp>
            <resource>1</resource>
            <empName>steve</empName>
          </emp>
          <emp>
            <resource>2</resource>
            <empName>mark</empName>
          </emp>
          <emp>
            <resource>3</resource>
            <empName>alex</empName>
          </emp>
        </empList>
      </project>
      <project>
        <pid>p4</pid>
        <empList>
          <emp>
            <resource>1</resource>
            <empName>alex</empName>
          </emp>
        </empList>
      </project>
      <project>
        <pid>p3</pid>
        <empList>
          <emp>
            <resource>1</resource>
            <empName>john</empName>
          </emp>
        </empList>
      </project>
    </projects>
    
    
    p2
    1.
    史提夫
    2.
    做记号
    3.
    亚历克斯
    p4
    1.
    亚历克斯
    p3
    1.
    厕所
    

    要列出被排除的员工,您可以这样做(不幸的是,没有“否定”键):

    
    
    返回:

    <?xml version="1.0" encoding="UTF-8"?>
    <projects>
      <project>
        <pid>p2</pid>
        <employees-exclude>
          <emp>
            <empName>john</empName>
          </emp>
        </employees-exclude>
      </project>
      <project>
        <pid>p4</pid>
        <employees-exclude>
          <emp>
            <empName>steve</empName>
          </emp>
          <emp>
            <empName>mark</empName>
          </emp>
          <emp>
            <empName>john</empName>
          </emp>
        </employees-exclude>
      </project>
      <project>
        <pid>p3</pid>
        <employees-exclude>
          <emp>
            <empName>steve</empName>
          </emp>
          <emp>
            <empName>mark</empName>
          </emp>
          <emp>
            <empName>alex</empName>
          </emp>
        </employees-exclude>
      </project>
    </projects>
    
    
    p2
    厕所
    p4
    史提夫
    做记号
    厕所
    p3
    史提夫
    做记号
    亚历克斯
    
    您的问题并不完全清楚。看到转换给定示例的预期结果会很有帮助。通常,您可以使用从项目(或角色)上下文中获取合格员工。我不知道你所说的“不参与”是什么意思。@Michel,我编辑了我的问题,添加了预期输出。非常感谢,“输入”(
    p2
    )来自哪里?为什么在场景3中,
    alex
    被排除在结果之外?输入来自pid元素,这是我的要求,基于某些条件,我必须选择“p2”。是的,亚历克斯应该在第三场。我编辑了它。谢谢。“根据某些条件,我必须选择‘p2’。”恐怕这并不能说明什么。你说的是“给定的项目id”,但你的输入中没有“给定的”项目id:所有的项目都是平等的。非常感谢Michael。@panneer如果你的问题得到了回答,请通过接受答案来结束它。
    <xsl:template match="/employees">
        <projects>
            <xsl:for-each select="projects/project">
                <project>
                    <xsl:copy-of select="pid"/>
                     <employees-exclude>
                        <xsl:for-each select="/employees/employee[not(work = current()/roles/role)]">
                            <emp>
                                <empName>
                                    <xsl:value-of select="name"/>
                                </empName>
                            </emp>
                        </xsl:for-each>
                     </employees-exclude>
                </project>
            </xsl:for-each>
        </projects>
    </xsl:template>
    
    <?xml version="1.0" encoding="UTF-8"?>
    <projects>
      <project>
        <pid>p2</pid>
        <employees-exclude>
          <emp>
            <empName>john</empName>
          </emp>
        </employees-exclude>
      </project>
      <project>
        <pid>p4</pid>
        <employees-exclude>
          <emp>
            <empName>steve</empName>
          </emp>
          <emp>
            <empName>mark</empName>
          </emp>
          <emp>
            <empName>john</empName>
          </emp>
        </employees-exclude>
      </project>
      <project>
        <pid>p3</pid>
        <employees-exclude>
          <emp>
            <empName>steve</empName>
          </emp>
          <emp>
            <empName>mark</empName>
          </emp>
          <emp>
            <empName>alex</empName>
          </emp>
        </employees-exclude>
      </project>
    </projects>