XSLT: добавить пространство имен, скопировать содержимое, изменить значение копируемого содержимого - PullRequest
0 голосов
/ 05 июня 2018

У меня есть XML, я хотел бы сделать некоторые преобразования, на которых я не могу работать в Java.Ниже я указал вход, желаемый результат и мою попытку.Я не знаю, что я делаю здесь неправильно, любая помощь приветствуется.

Подводя итог, я хочу в основном сделать три преобразования:

  1. Добавить объявление нового пространства имен.
  2. Изменение номера версии.
  3. Перемещение определенных элементов в новое пространство имен.

Я предполагаю, что при копировании что-то не так.Может быть, после копирования я что-то перезаписываю.

Это мой ввод:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Structure xmlns="http://www.example.com/xsd/Structure"
                            version="2.0"
                            name="myName">

  <Graph name="test">

    <Vertices>
      <Vertex name="n1" kind="input"/>
      <Vertex name="n2" kind="output"/>
    </Vertices>

    <Edges>
      <Edge start="n1" end="n2">
        <Transformation>
          <Entry entry="1"/>
        </Transformation>
      </Edge>
    </Edges>

  </Graph>

</Structure>

Это мой желаемый вывод:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Structure xmlns:cs="http://www.example.com/xsd/ControlStructure"
xmlns="http://www.example.com/xsd/Structure" version="3.0"
name="myName">            <--- Declared name space and changed version

  <Graph name="test">

    <Vertices>
      <Vertex name="n1" kind="input"/>
      <Vertex name="n2" kind="output"/>
    </Vertices>

    <Edges>
      <Edge start="n1" end="n2">
        <cs:Transformation>                 <--- Added name space
          <Entry entry="1"/>
        </cs:Transformation>                <--- Added name space
      </Edge>
    </Edges>

  </Graph>

</Structure>

Это мой XSLT:

<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

    <xsl:output encoding='UTF-8' indent='yes' method='xml'/>

    <xsl:param name="cs" select="'http://www.example.com/xsd/ControlStructure'"/>

    <!-- copy everything into the output -->
    <xsl:template match='@*|node()'>
      <xsl:copy>
        <xsl:apply-templates select='@*|node()'/>
      </xsl:copy>
    </xsl:template>

    <!-- Declare new name space -->
    <xsl:template match="/*[local-name()='Structure']">
        <Structure xmlns:cs="http://www.example.com/xsd/ControlStructure>"
            <xsl:copy-of select="node()|@*"/>
        </Structure>
    </xsl:template>  


    <!-- Upgrade version attribute -->
    <xsl:template match="node()[local-name()='Structure']/@version">
      <xsl:attribute name="version">
        <xsl:value-of select="'3.0'"/>
      </xsl:attribute>
    </xsl:template>

    <!-- Move all *Transformation elements to the cs namespace -->
    <xsl:template match="node()[contains(local-name(), 'Transformation')]">
      <xsl:element name="cs:{local-name()}">
        <xsl:apply-templates select="node()|@*"/>
      </xsl:element>
    </xsl:template>

</xsl:stylesheet>

1 Ответ

0 голосов
/ 05 июня 2018

У вас есть параметр cs, связанный с новым пространством имен, которое вы не используете.Неясно, действительно ли вы хотите, чтобы новое пространство имен было параметром времени выполнения, или оно может быть жестко запрограммировано.Если вы хотите, чтобы это был параметр, тогда вам лучше всего перейти на процессор XSLT 2.0 и использовать пространство имен xsl: *. 1001 *

В противном случае вы находитесь на правильных линиях.

Ваш шаблон для изменения атрибута версии не имеет никакого эффекта, потому что он никогда не срабатывает: это потому, что ваш шаблон для элемента структуры копирует атрибуты без изменений, а не применяет к ним шаблоны.

В инструкции <xsl:element name="cs:{local-name()}"> Вы должны добавить атрибут namespace, чтобы определить новый URI пространства имен.В противном случае он ищет привязку префикса "cs" в таблице стилей, а его нет.Для этого недостаточно иметь привязку в дереве результатов.

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