XSLT не может преобразовать DITA в новый тип

У меня есть следующий xml:

<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE concept SYSTEM "aimlDomain.dtd">
<?xml-stylesheet type = "text/xsl" href = "aimlTest.xsl"?>
<concept>
<category>
   <pattern>_ TOPIC ELEMENT ATTRIBUTE</pattern>
   <template><srai>REQUIRED TOPIC AND MAP ELEMENT ATTRIBUTES</srai> 
   </template>
</category> 
<category>
   <pattern>TOPIC ELEMENT ATTRIBUTE _</pattern>
   <template><srai>REQUIRED TOPIC AND MAP ELEMENT ATTRIBUTES</srai> 
   </template>
</category>
</concept>

Категория элемента - это новый домен, который я добавляю со специализацией элемента, который специализируется на внешнем элементе. Я хочу преобразовать файл в цель, новый тип преобразования. Ожидаемый результат должен быть таким:

`   <?xml version = "1.0" encoding = "utf-8"?>
    <category>
      <pattern>_ TOPIC ELEMENT ATTRIBUTE</pattern>
      <template><srai>REQUIRED TOPIC AND MAP ELEMENT ATTRIBUTES</srai> 
      </template>
    </category>`

Но в файле нет ничего, кроме декларатинона. Фактический результат выглядит следующим образом:

<?xml version = "1.0" encoding = "UTF-8"?>

Вот мой aimlTest.xsl :

  <xsl:stylesheet version = "2.0" 
    xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
    <xsl:template match = "*[contains(@class, ' topic/topic topic/concept ')]">
    <xsl:for-each select = "*[contains(@class, ' topic/foreign category-d/category 
    ')]">
    <xsl:copy-of select = "."/>
    </xsl:for-each>
    </xsl:template>
    </xsl:stylesheet>

Я хочу знать, как выбрать ожидаемый контент.

В вашем XML нет элемента с атрибутом class, поэтому ничего не выбирается. - У вас есть два практически одинаковых элемента category; почему нужно копировать только один /

michael.hor257k 11.12.2018 05:27

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

Maggie Chen 11.12.2018 07:56

Правильно ли определены атрибуты @class в вашем DTD? Правильно ли загружен DTD? Вы запускаете преобразование с помощью подходящего плагина DITA-OT?

potame 11.12.2018 09:57

Обратите внимание, что ваше выражение contains, вероятно, должно быть contains(' topic/topic topic/concept ', @class), хотя само по себе я не думаю, что это решит вашу проблему.

Tim C 11.12.2018 10:22

Вот мой тестовый код в Git: github.com/ant28/aimlTest. Я перепробовал много методов, но так и не решил.

Maggie Chen 11.12.2018 10:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
161
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть много посторонних факторов, которые усложняют это. Один из них соответствует атрибуту @class вместо имен элементов. Поэтому я сделал упрощенную версию, см. Ниже.

Вот входной файл DITA, который я использовал (я удалил ваши DTD и XSLT PI, потому что они мне не нужны в этом примере):

<?xml version = "1.0" encoding = "utf-8"?>
<concept>
  <category>
    <pattern>_ TOPIC ELEMENT ATTRIBUTE</pattern>
    <template>
      <srai>REQUIRED TOPIC AND MAP ELEMENT ATTRIBUTES</srai>
    </template>
  </category>
  <category>
    <pattern>TOPIC ELEMENT ATTRIBUTE _</pattern>
    <template>
      <srai>REQUIRED TOPIC AND MAP ELEMENT ATTRIBUTES</srai>
    </template>
  </category>
</concept>

Вот XSLT, который я использовал, сопоставление только по именам элементов:

<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "2.0" 
  xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
  <xsl:template match = "concept">
    <root>
      <xsl:for-each select = "category">
        <xsl:copy-of select = "."/>
      </xsl:for-each>
    </root>
  </xsl:template>
</xsl:stylesheet>

Я добавил корневой элемент (названный <root>, может быть любым именем) в XSLT, чтобы на выходе был правильный XML.

И вот результат:

<?xml version = "1.0" encoding = "UTF-8"?>
<root>
  <category>
    <pattern>_ TOPIC ELEMENT ATTRIBUTE</pattern>
    <template>
      <srai>REQUIRED TOPIC AND MAP ELEMENT ATTRIBUTES</srai>
    </template>
  </category>
  <category>
    <pattern>TOPIC ELEMENT ATTRIBUTE _</pattern>
    <template>
      <srai>REQUIRED TOPIC AND MAP ELEMENT ATTRIBUTES</srai>
    </template>
  </category>
</root>

Если вы хотите, вы можете реорганизовать его, чтобы использовать сопоставление атрибутов @class, но я подозреваю, что вам это не нужно. Если вам это действительно нужно, сначала убедитесь, что ваш DTD правильно добавляет атрибуты класса. В DITA DTD атрибуты класса «установлены по умолчанию», что означает, что они включены в каждый экземпляр XML, даже если они не присутствуют буквально в XML (синтаксис см. В DITA DTD). Для целей публикации DITA OT запускает предварительный процесс для файлов DITA XML, который извлекает все атрибуты @class по умолчанию перед запуском XSLT. Тогда XML будет выглядеть примерно так:

<concept class = " topic/concept ">
  <category class = " topic/foreign category-d/category ">
    <pattern class = " etc ">_ TOPIC ELEMENT ATTRIBUTE</pattern>
    <template class = " etc ">
      <srai>REQUIRED TOPIC AND MAP ELEMENT ATTRIBUTES</srai>
    </template>
  </category>
[...]

И тогда ваш исходный XSLT может соответствовать атрибутам класса. У DITA есть веская причина для сопоставления этих атрибутов @class, но вам может не понадобиться это делать, и вы добавляете сложности, пытаясь это сделать.

Спасибо, я попробовал ваш метод в DITA-OT, но так и не получил ничего. Как вы разбираете файл?

Maggie Chen 14.12.2018 04:18

Я запускал его вне DITA OT, используя только XSLT-процессор. Попробуйте выполнить это из командной строки: <dita-ot>\lib\java -jar Saxon-HE-9.8.0-12.jar -s:path-to-dita.dita -xsl:path-to-xslt.xsl -o:output-file.xml - вам нужно указать Java в командной строке. Возможно, придется изменить имя файла Saxon jar. Используйте мои файлы выше.

markg 14.12.2018 08:00

Большое спасибо! Я попробовал ваш метод, он работает! Но у меня есть еще одна проблема, заключающаяся в том, что я получаю невыделенное содержимое в файле. Из-за ограниченного пространства я размещаю свой код в группе пользователей Google DITA-OT: groups.google.com/forum/#!topic/dita-ot-users/n1LeaHb3PtI. Большое спасибо.

Maggie Chen 14.12.2018 12:17

Другие вопросы по теме