Добавить новый элемент в импортированный xsl с помощью таблицы стилей - PullRequest
0 голосов
/ 26 апреля 2019

Проблема: У меня есть demo.xsl и demo2.xsl. Я не могу изменить demo.xsl, и мне нужно добавить новый элемент (страну) внутри «числа». Поэтому я импортирую demo.xsl и застрял. Как я могу продолжить? Как я могу вставить новый тег?

вывод demo.xsl:

   <cars color="green">
      <brand>Suzuki</brand>
      <number>ASD-653</number>
   </cars>

Ожидаемый вывод demo2.xsl:

   <cars color="green">
      <brand>Suzuki</brand>
      <number>ASD-653</number>
         <country>ROM</country>
   </cars>

demo.xsl:

 <xsl:template match="cars[@element-type='recordset']/record">
    <cars>
      <xsl:attribute name="color">
        <xsl:value-of select="color" />
      </xsl:attribute>
      <brand>
        <xsl:value-of select="brand" />
      </brandr>    
      <number>
        <xsl:value-of select="number" />
      </number>
    </cars>
  </xsl:template>

demo2.xsl:

 <xsl:import href="demo.xsl" />

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Вот почему не рекомендуется использовать такой стиль "кирпича", как:

  <xsl:template match="cars[@element-type='recordset']/record">
    <cars color="{color}">
      <brand>
        <xsl:value-of select="brand" />
      </brandr>    
      <number>
        <xsl:value-of select="number" />
      </number>
    </cars>
  </xsl:template>

Механизм расширения XSLT, как и в любом языке с «наследованием», может воздействовать на результат «суперкласса» для дальнейшей обработки (даже второго проходного преобразования, предложенного ответом Мартина Хоннена ) , Но если вы используете этот стиль в импортированной таблице стилей:

  <xsl:template match="cars[@element-type='recordset']/record">
    <cars color="{color}">
      <xsl:apply-templates/>
    </cars>
  </xsl:template>

  <xsl:template match="record/brand|record/number">
    <xsl:copy-of select="."/>
  </xsl:template>

  <xsl:template match="record/*"/>

Тогда вы можете просто добавить к приложенной таблице стилей

  <xsl:template match="cars[@element-type='recordset']/record">
    <cars color="{color}">
      <xsl:apply-templates/>
      <country>ROM</country>
    </cars>
  </xsl:template>

Или, если элемент country может быть результатом другого дочернего элемента record, вам понадобится простое правило:

  <xsl:template match="record/country">
    <xsl:copy-of select="."/>
  </xsl:template>
1 голос
/ 26 апреля 2019

Вам необходимо добавить шаг преобразования:

<xsl:template match="cars[@element-type='recordset']/record">
  <xsl:variable name="import-result">
     <xsl:apply-imports/>
  </xsl:variable>
  <xsl:apply-templates select="$import-result/node()" mode="add"/>
</xsl:template>

<xsl:template match="@* | node()" mode="add">
   <xsl:copy>
      <xsl:apply-templates select="@* | node()" mode="#current"/>
   </xsl:copy>
</xsl:template>

<xsl:template match="cars" mode="add">
   <xsl:copy>
      <xsl:apply-templates select="@* | node()" mode="#current"/>
      <country>ROM</country>
    </xsl:copy>
</xsl:template>

Чтобы иметь возможность использовать <xsl:apply-templates select="$import-result/node()" mode="add"/>, вам необходим процессор XSLT 2 или процессор XSLT 1, для которого не требуется расширение для преобразования переменной с фрагментом результирующего дерева в набор узлов; поскольку большинству процессоров XSLT 1 требуются функции расширения, вам нужно изменить эту строку на

<xsl:apply-templates xmlns:exsl="http://exslt.org/common" select="exsl:node-set($import-result)/node()" mode="add"/>    

Если значение элемента country зависит от данных (например, дочернего элемента или атрибута) в исходном record, то вы можете передать это в шаблоне apply (например, для атрибута country record) )

<xsl:apply-templates select="$import-result/node()" mode="add">
  <xsl:with-param name="country" select="@country"/>
</xsl:apply-templates>

и используйте его с

<xsl:template match="cars" mode="add">
   <xsl:param name="country"/>
   <xsl:copy>
      <xsl:apply-templates select="@* | node()" mode="#current"/>
      <country>
         <xsl:value-of select="$country"/>
      </country>
    </xsl:copy>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...