XSLT - вложенный для каждого с core-if - PullRequest
0 голосов
/ 21 февраля 2020

Я хочу удалить узлы ресурсов из XML, если их нет в узле TaskLabor с использованием атрибута resourceID. Я не знаю, как получить доступ к переменным внутри для каждого. Кто-нибудь может пожалуйста это исправить?

Я предоставил XSL-преобразование ниже. Вместо каждого, можно ли это сделать с помощью apply-templates?

Input 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 Transformation:

<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 голос
/ 21 февраля 2020

Объявите ключ <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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...