【问题标题】:XSLT 1.0: Counting number of matched block and create MapXSLT 1.0:计算匹配块的数量并创建地图
【发布时间】:2017-05-21 08:53:17
【问题描述】:

我搜索过,发现变量在 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>

输出:

场景(问题):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>

场景(问题):3

<Projects>
    <pid>p2</pid>
    <empList>
        <emp>
            <resource>1</resource>
            <!-- like GUID , unique, increment  starts from '1'-->
            <empName>steve</empName>
        </emp>
        <emp>
            <resource>2</resource>
            <!-- like GUID , unique-->
            <empName>mark</empName>
        </emp>
        <emp>
           <resource>3</resource>
           <!-- like GUID , unique-->
           <empName>alex</empName>
       </emp>
    </empList>
</Projects>

问题:

  1. 我可以创建一个维护所有员工详细信息的地图吗? (键是“工作”,值是 id+name 的列表),这可能吗? 输出:我想根据项目 id 准备 emp 列表。有一个逻辑。所以,我得提前准备一份清单。
  2. 对于给定的项目 id (pid),我想根据角色 (Block2) 获取所有基于工作(来自 Block1)选择的员工,哪些员工不属于其中?输入将是 输出:

  3. 计算匹配的条目数?我们有'position()',它告诉for循环中的当前迭代。但我只想要匹配的块。 例如,如果有 3 个雇员匹配出 6 个。我需要附加值,例如资源 + 唯一 ID。唯一 ID 从 '1' 开始。 输出:

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

【问题讨论】:

  • 您的问题并不完全清楚。查看转换给定示例的预期结果会很有帮助。通常,您可以使用 key 从项目(或角色)的上下文中获取符合条件的员工。我不确定你所说的“不属于它”是什么意思。
  • @Michel,我编辑了我的问题,添加了预期的输出。非常感谢,
  • “输入”(p2)从何而来?为什么alex 被排除在场景 3 的结果之外?
  • 输入来自 pid 元素,这是我的要求,根据某些条件我必须选择“p2”。是的,亚历克斯应该在 Scenrio3 中。我编辑了它。谢谢。
  • "基于某些条件,我必须选择 'p2'。" 恐怕这并不能告诉我任何事情。您说的是“给定项目 id”,但您的输入中没有“给定”项目 id:所有项目都是平等给出的。

标签: dictionary xslt-1.0 counter


【解决方案1】:

为了推动这一进程,请尝试以此为起点:

XSLT 1.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>

要列出排除的员工,您可以执行以下操作(不幸的是,没有“否定”键):

<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>

【讨论】:

  • 非常感谢迈克尔。
  • @panneer 如果您的问题得到解答,请通过接受答案来关闭它。
猜你喜欢
  • 2016-11-10
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多