2017-02-14 23 views
0

Я создал файл 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 в более конкретные таблицы стилей; этот элементный блок и его содержимое разделяются между всеми отдельными таблицами стилей, причем каждый из них добавляет разные элементы и значения к этому элементу «блок» в зависимости от того, какой из них используется.

ответ

1

Вам необходимо будет использовать переменная как в

<xsl:variable name="temp"> 
     <xsl:element name="custom_Occurrence"> 
      <!-- template adds 2 more elements to custom_Occurrence, omitted for brevity --> 
      <xsl:call-template name="createOccurrenceContent" /> 
     </xsl:element> 
</xsl:variable> 

<xsl:apply-templates select="$temp/node()"/> 

Если вы хотите применить шаблон к узлу, создаваемому вашим XSLT.

+0

Я не уверен, что понял. Итак, создайте общую переменную и назовите ее общим? – jbailie1991

+0

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

+0

Это полностью исключало элемент custom_Occurrence, предполагая, что я правильно соблюдал этот подход, вы можете расширить фрагмент кода для контекста? – jbailie1991