Я создал файл XSL, содержащий общие преобразования, которые должны выполняться в xml. Этот файл будет включен в несколько других XSL-файлов, которые затем добавят больше шаблонов поверх этих общих правил. Проблема в том, что я хочу сопоставить элемент, который будет создан вместе с шаблоном, но нет никакой гарантии, он будет создан к тому моменту, когда более конкретный xsl должен соответствовать ему. XSL:xsl: сопоставление нового созданного элемента из другого xsl-файла
общего stylesheet.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.standards.org/Intake"
xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0"> <!-- xs namespace allows typed functions and parameters -->
<xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*" />
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:copy-of select="@*" />
<xsl:apply-templates select="@*|node()" />
</xsl:element>
</xsl:template>
<xsl:template match="@*|text()|comment()|processing-instruction()">
<xsl:copy />
</xsl:template>
<!-- remove root -->
<xsl:template match="/*">
<xsl:apply-templates select="node()" />
</xsl:template>
<xsl:template match="OccurrenceData">
<xsl:element name="{local-name()}">
<xsl:element name="custom_Occurrence">
<!-- template adds 2 more elements to custom_Occurrence, omitted for brevity -->
<xsl:call-template name="createOccurrenceContent" />
</xsl:element>
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<!-- rest of stylesheet -->
</xsl:stylesheet>
первым конкретным-stylesheet.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:import href="common-stylesheet.xsl" />
<xsl:template match="custom_Occurrence">
<xsl:element name="{local-name()}">
<xsl:element name="custom_TestElement"/>
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<!-- rest of stylesheet -->
</xsl:stylesheet>
Я посылаю следующий ввод XML с помощью первого конкретного-таблицы стилей:
ввод.xml
<Request>
<RequestData>
<Occurrence>
<OccurrenceCd>EJ104</OccurrenceCd>
<!-- more children -->
</Occurrence>
<!-- rest of input-->
</RequestData>
</Request>
И результат должен выглядеть следующим образом:
желательно-output.xml
<RequestData>
<Occurrence>
<OccurrenceCd>EJ104</Occurrence>
<custom_Occurrence>
<custom_TestElement />
</custom_Occurrence>
<!--more children -->
</Occurrence>
<!-- rest of output -->
</RequestData>
В минуту, общие шаблоны прибежал и они работают, как и ожидалось, но <custom_TestElement>
отсутствует от <custom_Occurrence>
. Есть ли способ включить общий файл к ним в отдельный файл xsl и обеспечить, чтобы обычные шаблоны файлов запускались до того, как более конкретный файл начнет соответствовать новым элементам ? Возможно ли это в одном файле, или мне придется разделить преобразования на свои собственные шаги, то есть сначала запустить общее преобразование, а затем передать XML в более конкретный xml?
Примечание: Я использую <xsl:element name="{local-name()}">
и измененное преобразование идентичности с дополнительным форматом шаблона, поскольку исходный xml не имеет пространства имен, и я применяю его в общем xsl; без них пространство имен было применено к каждому элементу, либо с пустым значением, либо с полным значением. Кроме того, я использую Saxon-HE v9.7.0-8 для преобразований
EDIT: Я не смог бы перемещать создание custom_OCCurrence в более конкретные таблицы стилей; этот элементный блок и его содержимое разделяются между всеми отдельными таблицами стилей, причем каждый из них добавляет разные элементы и значения к этому элементу «блок» в зависимости от того, какой из них используется.
Я не уверен, что понял. Итак, создайте общую переменную и назовите ее общим? – jbailie1991
Вместо ' ... xsl: element>' вам нужно поместить код, который я указал в ответе, чтобы этот элемент был сначала создан, а затем обработан, нет магии наличия вновь созданных узлов, сопоставленных шаблонами, поэтому вам либо нужно использовать переменную, либо вам действительно нужно выполнить шаги обработки. –
Это полностью исключало элемент custom_Occurrence, предполагая, что я правильно соблюдал этот подход, вы можете расширить фрагмент кода для контекста? – jbailie1991