XSLT не может преобразовать DITA в новый тип - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть 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>

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

`   <?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>

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

1 Ответ

0 голосов
/ 11 декабря 2018

Есть много посторонних факторов, которые усложняют это.Один из них соответствует атрибуту @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 правильно добавляет атрибуты класса.В DTD DITA атрибуты класса «по умолчанию», что означает, что они включены в каждый экземпляр XML, даже если они не находятся в буквальном смысле в XML (синтаксис см. В DTD DITA).В целях публикации DITA OT запускает предварительный процесс для файлов XML DITA, который извлекает все атрибуты @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, но вам может и не понадобиться делать это, и вы добавляете усложнение, пытаясь это сделать.

...