XSLT-преобразование

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

У меня есть два элемента, например:

<linum class="topic/linum secondAtt/secondVal">Blah</linum>
<linum class="topic/linum">Blah</linum>

Если атрибут класса linum имеет второе значение, я должен добавить еще один атрибут к этому элементу, используя второе значение этого атрибута. Если он только один, то я оставлю его как есть.

Таким образом, вывод для двух вышеуказанных выводов будет следующим:

<linum class="topic/linum secondAtt/secondVal" newAttribute="secondVal">Blah</linum>
<linum class="topic/linum">Blah</linum>

Я надеюсь, что объяснил это хорошо, если не надеюсь, что мой вывод ясен, поскольку только первый элемент преобразуется путем добавления нового атрибута со вторым значением.

Я ценю любую помощь, которую мне дают!


person HelpMeWithXSLT    schedule 21.09.2016    source источник
comment
Что именно означает второе значение? Я вижу только одно значение в обоих.   -  person michael.hor257k    schedule 21.09.2016
comment
значение класса первого элемента = тема/linum secondAtt/secondVal значение класса второго элемента = тема/linum первый элемент имеет два значения, тема linum и secondAtt/secondVal. у второго элемента есть только один, тема/линия. если элемент имеет два значения, мне нужно получить вторую часть второго значения и добавить его в качестве нового атрибута к тому же элементу, как показано в моем примере вывода.   -  person HelpMeWithXSLT    schedule 21.09.2016
comment
Может ли быть третье значение? Если да, то каким должен быть результат в таком случае?   -  person michael.hor257k    schedule 21.09.2016
comment
В DITA каждый элемент имеет свой собственный атрибут класса, уникальный во всем DTD или схеме. Так что это не обычная ситуация, когда элемент «linum» имеет два разных атрибута @class. Если вы не знакомы с таблицей стилей обработки DITA, лучше обратиться к спецификации DITA «2.5.3.6 правила и синтаксис атрибутов класса» (docs.oasis-open.org/dita/dita/v1.3/os /part3-все включено/). Или вы должны проконсультироваться со своей специализацией DTD (или схемой), как в ней определяется атрибут класса. (Поскольку «linum» не является стандартным элементом DITA.)   -  person tmakita    schedule 22.09.2016
comment
Также не рекомендуется ссылаться на имя элемента непосредственно в xsl:template/@match. Вы можете изучить, как они обрабатываются в таблице стилей DITA, на множестве примеров в плагинах GitHub DITA-OT (github.com/dita-ot/dita-ot/tree/develop/src/main/plugins).   -  person tmakita    schedule 22.09.2016


Ответы (1)


Следующее будет работать для вашего примера, где атрибут class содержит не более двух значений, разделенных пробелами:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="linum[contains(@class, ' ')]">
    <linum class="{@class}" newAttribute="{substring-after(substring-after(@class, ' '), '/')}">
        <xsl:apply-templates/>
    </linum>
</xsl:template>

</xsl:stylesheet>
person michael.hor257k    schedule 21.09.2016
comment
Спасибо за ваш ответ, Михаил, это очень ценно. Я попробую это сегодня и сообщу, когда у меня будет шанс. - person HelpMeWithXSLT; 21.09.2016