Почему этот XSLT добавляет контент после завершения шаблона? - PullRequest
0 голосов
/ 04 февраля 2020

Итак, общая картина в том, что я пытаюсь определить, почему существует «контент в прологе» (что недопустимо).

Похоже, что контент, который включается, исходит из результата этого XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:wd="urn:com.workday/bsvc">
    <xsl:output method="xml" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*" />

    <!-- <xsl:template match="props['xpath_matchHoursDateType']">  -->
    <xsl:template match="wd:Report_Data/wd:Report_Entry[1]/wd:Employee_ID">
        <Root>
            <xsl:copy-of select="."/>
        </Root>
    </xsl:template>
</xsl:stylesheet>

... который при применении к следующему XML дает удивительный результат:

<wd:Report_Data xmlns:wd="urn:com.workday/bsvc">
    <wd:Report_Entry>
        <wd:Employee_ID>123456</wd:Employee_ID>
    </wd:Report_Entry>
    <wd:Report_Entry>
        <wd:Employee_ID>234567</wd:Employee_ID>
    </wd:Report_Entry>
    <wd:Report_Entry>
        <wd:Employee_ID>345678</wd:Employee_ID>
    </wd:Report_Entry>
    <wd:Report_Entry>
        <wd:Employee_ID>456789</wd:Employee_ID>
    </wd:Report_Entry>
    <wd:Report_Entry>
        <wd:RBO_Group>
            <wd:Date_Worked>12/15/2014</wd:Date_Worked>
            <wd:Hours>41.53</wd:Hours>
            <wd:Type>TypeA</wd:Type>
            <wd:Process_Date>09/20/2019</wd:Process_Date>
        </wd:RBO_Group>
        <wd:RBO_Group>
            <wd:Date_Worked>12/15/2014</wd:Date_Worked>
            <wd:Hours>41.53</wd:Hours>
            <wd:Type>TypeA</wd:Type>
            <wd:Process_Date>01/30/2020</wd:Process_Date>
        </wd:RBO_Group>
        <wd:Employee_ID>567890</wd:Employee_ID>
    </wd:Report_Entry>
</wd:Report_Data>

Результат:

<Root xmlns:wd="urn:com.workday/bsvc"><wd:Employee_ID>123456</wd:Employee_ID></Root>23456734567845678912/15/201441.53TypeA09/20/201912/15/201441.53TypeA01/30/2020567890

Я ожидаю, что шаблон будет соответствовать узлу "wd: Employee_ID" первого найденного им узла "wd: Report_Entry", скопировать его, а затем будет выполнен. Поэтому я удивлен, увидев что-нибудь после закрывающего тега Root. Я не лучший программист XSL, и я только сейчас работаю с потоковым XSL 3.0, так что это может быть частью уравнения.

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

Итак, почему остальная часть XML содержание, добавляемое к результату после завершения (AFAIK) шаблона?

1 Ответ

1 голос
/ 04 февраля 2020

Каждая таблица стилей XSLT содержит так называемые «правила по умолчанию». Они будут рекурсивно обрабатывать входной документ следующим образом, начиная с узла root:

  1. найти дочерние узлы, применить к ним шаблоны
  2. , если дочерний узел является текстом узел, скопируйте текст в вывод
  3. , если дочерний узел является узлом элемента, начните с 1.
  4. , любой другой узел будет пропущен

Ваша таблица стилей содержит только один шаблон, соответствующий узлу одного типа, переопределяя поведение по умолчанию для этого типа узла.

Он не содержит ничего, что могло бы помешать выполнению правил по умолчанию, поэтому вы получаете все виды текстовых узлов как часть

Измените свою таблицу стилей следующим образом:

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:wd="urn:com.workday/bsvc">
    <xsl:output method="xml" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*" />

    <xsl:template match="/">
        <xsl:apply-templates select="wd:Report_Data/wd:Report_Entry[1]/wd:Employee_ID" />
    </xsl:template>

    <!-- <xsl:template match="props['xpath_matchHoursDateType']">  -->
    <xsl:template match="wd:Report_Data/wd:Report_Entry[1]/wd:Employee_ID">
        <Root>
            <xsl:copy-of select="."/>
        </Root>
    </xsl:template>
</xsl:stylesheet>

, и она начнет работать так, как вы ожидаете.

template match="/" переопределит поведение по умолчанию непосредственно в узле root и не оставляйте места для правил по умолчанию.

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