У меня есть следующий 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>
Я хочу знать, как выбрать ожидаемый контент.
Каждый элемент в DITA имеет класс атрибута по умолчанию, но я не знаю, как его отобразить.
Правильно ли определены атрибуты @class в вашем DTD? Правильно ли загружен DTD? Вы запускаете преобразование с помощью подходящего плагина DITA-OT?
Обратите внимание, что ваше выражение contains, вероятно, должно быть contains(' topic/topic topic/concept ', @class), хотя само по себе я не думаю, что это решит вашу проблему.
Вот мой тестовый код в Git: github.com/ant28/aimlTest. Я перепробовал много методов, но так и не решил.





Есть много посторонних факторов, которые усложняют это. Один из них соответствует атрибуту @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, но так и не получил ничего. Как вы разбираете файл?
Я запускал его вне 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. Используйте мои файлы выше.
Большое спасибо! Я попробовал ваш метод, он работает! Но у меня есть еще одна проблема, заключающаяся в том, что я получаю невыделенное содержимое в файле. Из-за ограниченного пространства я размещаю свой код в группе пользователей Google DITA-OT: groups.google.com/forum/#!topic/dita-ot-users/n1LeaHb3PtI. Большое спасибо.
В вашем XML нет элемента с атрибутом
class, поэтому ничего не выбирается. - У вас есть два практически одинаковых элементаcategory; почему нужно копировать только один /