如果使用 resourceID 属性在 TaskLabor 节点中不存在 Resource 节点,我想从 XML 中删除它们。 我不知道如何访问 for-each 内部的变量。 任何人都可以解决这个问题吗?

我在下面提供了 XSL 转换。 而不是for-each,可以使用apply-templates来完成吗?

输入 XML:

<Project projectID="project1" name="My Project">
    <Resources>
        <Resource resourceID="abc@mycompany.com"/>
        <Resource resourceID="def@mycompany.com"/> <!-- Need to Remove this -->
        <Resource resourceID="xyz@mycompany.com"/>
        <Resource resourceID="test@mycompany.com"/> <!-- Need to Remove this -->
    </Resources>
    <Tasks>
        <Task name="Task1"
        taskID="100-150221">
            <Assignments>
                <TaskLabor finish="2020-12-31"
                   resourceID="abc@mycompany.com"
                   start="2020-01-01">
                </TaskLabor>
                <TaskLabor finish="2020-12-31"
                   resourceID="xyz@mycompany.com"
                   start="2020-01-01">
                </TaskLabor>
            </Assignments>
        </Task>
        <Task name="Task2"
        taskID="100-12313">
            <Assignments>
                <TaskLabor finish="2020-12-31"
                   resourceID="abc@mycompany.com"
                   start="2020-01-01">
                </TaskLabor>
            </Assignments>
        </Task>
    </Tasks>
</Project>

XSL 转换:

<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:template match="/">
        <xsl:variable name="resources" select="Project/Resources/Resource"/>
        <xsl:variable name="tasks" select="Project/Tasks/Task"/>
        <xsl:for-each select="$resources">
            <xsl:variable name="resID" select="./@resourceID"/>
            <xsl:for-each select="$tasks">
                <xsl:for-each select="./Assignments/TaskLabor">
                     <xsl:if test="$resID = ./@resourceID">
                        <xsl:value-of select="Project/Resources/Resource"/>

                     </xsl:if>
                </xsl:for-each>
            </xsl:for-each>
        </xsl:for-each>
     </xsl:template>
</xsl:stylesheet>

预期产出

<Project projectID="project1" name="My Project">
    <Resources>
        <Resource resourceID="abc@mycompany.com"/>
        <Resource resourceID="xyz@mycompany.com"/>
    </Resources>
    <Tasks>
        <Task name="Task1"
        taskID="100-150221">
            <Assignments>
                <TaskLabor finish="2020-12-31"
                   resourceID="abc@mycompany.com"
                   start="2020-01-01">
                </TaskLabor>
                <TaskLabor finish="2020-12-31"
                   resourceID="xyz@mycompany.com"
                   start="2020-01-01">
                </TaskLabor>
            </Assignments>
        </Task>
        <Task name="Task2"
        taskID="100-12313">
            <Assignments>
                <TaskLabor finish="2020-12-31"
                   resourceID="abc@mycompany.com"
                   start="2020-01-01">
                </TaskLabor>
            </Assignments>
        </Task>
    </Tasks>
</Project>

#1楼 票数:1 已采纳

声明一个键<xsl:key name="task-ref" match="TaskLabor" use="@resourceID"/>然后你只需要阻止不引用 TaskLabor 的元素被身份转换复制为他们使用空模板:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:key name="task-ref" match="TaskLabor" use="@resourceID"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Resource[not(key('task-ref', @resourceID))]"/>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/3NSTbfg

  ask by dsouzaleo translate from so

未解决问题?本站智能推荐:

1回复

XSLT嵌套排序/for-each

我试图找出执行嵌套for-each和排序的最佳方法。 例如,我的XSLT执行以下操作: 选择节点集。 按日期排序属性。 执行position()以拉出4个节点。 现在,下一部分是我想要弄清楚的。 在第3步之后,我需要再次按Date属性排序,但这次按升序排序...现在数据
2回复

XSLT:for-each响应?

我正在将plist转换为XML,我很困惑为什么我的for-each返回两个响应,而如果我将for-each更改for-each value-of ,我根本得不到任何回报。 其他所有工作,我只想从我的XSLT获取单个Description / Title / Username 。 XML:
3回复

xslt中的for-each

我需要像我的根标记中循环所有元素 我写了for-each以获取所有“ rt”元素值。 但是我一个人就可以。 你能告诉我如何单独获得“ rt”值吗?
3回复

XSLT-在嵌套的for-each中时找到position()

我正在使用 XSLT 对一些相当复杂的 XML 执行转换。 为了实现我需要的输出,我必须创建一个嵌套的 for 循环,如下所示: 源 XML XSLT 问题我在这里尝试做的是 while 在我的嵌套循环中(在../element1/child/* )-我想知道: 我当前循环的元素的位置 - 例如
1回复

嵌套的for-each循环在XSLT中出现问题

我们在xslt中碰到一个问题,我们试图做一个嵌套的for-each,但是它不读取内部循环。 这是我们尝试过的代码: XML档案: xslt文件: 预期的JSON:
1回复

XSLT-使用for-each元素的嵌套对象

我想使用xslt转换将XML一种格式转换为另一种格式。 但是问题是我不知道如何使用for-each元素遍历嵌套对象。 XML输入格式: XML输出格式: 我试过这个xslt。 但是我坚持自己的初衷。 XSLT: 请指导我完成xslt。
2回复

XSLT问题中的for-each

我是XSLT的新手,并尝试进行for-each循环,以便每个节点都可以匹配来自不同根目录的另一个节点。 我有以下XML: 我需要获取以下XML输出: 意思是每个学生根据匹配的ID获得老师的名字。 但是我得到了所有老师的名字: 我的XSLT: 你能帮忙吗?
1回复

使用for-each的XSLT验证

我正在尝试为XSLT验证模板编写逻辑,以检查XML消息的各种情况下是否存在重复循环。 消息的结构是 这四个字段具有自己需要验证的代码。 每个ORC段只有一个ORC.3,每个ORC.3只有一组EI子组件。 但是,我仍然具有在订单组中考虑多个ORC段的概念,因此我仍然需要使用for-ea