Как мне обработать несколько операторов копирования XSLT в одном совпадении? - PullRequest
0 голосов
/ 16 декабря 2011

Существуют ли какие-либо операторы XSLT, которые будут выполняться с учетом других операторов XSLT в той же таблице стилей?

Например, если у меня есть два оператора копирования, сопоставленные одному и тому же узлу (но требуется только один скопированный узел, содержащий изменения, объявленные в ОБА операторы копирования), существует ли оператор, который будет делать это?

Предположим, что я не могу поместить все преобразования в один узел копирования, а вместо этого должен использовать два или более.

--- Более понятный пример ---

//XML
<toy></toy>

//XSLT
<xsl:template  match="toy">
<xsl:copy>
    <xsl:attribute name="label">SOME TOY</xsl:attribute>
</xsl:copy>
</xsl:template>


<xsl:template  match="toy">
<xsl:copy>
    <xsl:apply-templates select="@*" />
      <xsl:element name="range">
        <xsl:element name="min">200001</xsl:element>
        <xsl:element name="max">999999</xsl:element>
      </xsl:element>
</xsl:copy>
</xsl:template>

Мой желаемый результат - новый игрушечный узел, который копируется в новый файл, к которому применяются обе вещи, так что-то вроде:

<toy label='SOME TOY'>
  <range>
    <min>200001</min>
    <max>999999</max>
  </range>
</toy>

Не две разные копии

Возможно ли это? Есть ли какой-нибудь способ, которым я могу переделать первый шаблон, чтобы получить этот единственный результат?

1 Ответ

2 голосов
/ 16 декабря 2011

В спецификации XSLT есть правило, запрещающее это - Разрешение конфликтов для правил шаблона .

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

Но вы можете отделить его с помощью с именем шаблоны:

<xsl:template match="toy">
  <xsl:call-template name="toyAttribute" />
  <xsl:call-template name="toyElements" />
</xsl:template>

<xsl:template name="toyAttribute">
  <xsl:copy>
    <xsl:attribute name="label">SOME TOY</xsl:attribute>
  </xsl:copy>
</xsl:template>

<xsl:template name="toyElements">
  <xsl:copy>
    <xsl:apply-templates select="@*" />
    <xsl:element name="range">
      <xsl:element name="min">200001</xsl:element>
      <xsl:element name="max">999999</xsl:element>
    </xsl:element>
 </xsl:copy>
</xsl:template>

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

<!--toy template -->
<xsl:template match="/toys/toy">
    <!--copy toy node with namespaces -->
    <xsl:copy>
        <!-- copy toy node attributes -->
        <xsl:apply-templates select="@*" />
        <!-- add new attribute or xsl:call-template name="toyAttribute"-->
        <xsl:attribute name="label">SOME TOY</xsl:attribute>
        <!-- copy toy node child elements -->
        <xsl:apply-templates select="node()" />
        <!-- add new elements - or xsl:call-template name="toyElements"-->
        <xsl:element name="range">
            <xsl:element name="min">200001</xsl:element>
            <xsl:element name="max">999999</xsl:element>
        </xsl:element>
    </xsl:copy>
</xsl:template>

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

который для XML:

<?xml version="1.0" encoding="UTF-8"?> 
<toys>
    <toy name="a">
        <toy-part/>
    </toy>
    <toy name="b">
        <toy-part/>
    </toy>
</toys>

даст следующий результат:

<?xml version="1.0" encoding="utf-8"?><toys>
    <toy name="a" label="SOME TOY">
        <toy-part/>
        <range>
           <min>200001</min>
           <max>999999</max>
        </range>
    </toy>
    <toy name="b" label="SOME TOY">
        <toy-part/>
        <range>
           <min>200001</min>
           <max>999999</max>
        </range>
    </toy>
</toys>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...