В XSLT возможно ли вставить элемент перед потомками с идентификаторами? - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть особый случай. В документе XML я хочу вставить определенный элемент перед каждым дочерним элементом с идентификатором. Это возможно?

Я могу сделать это без использования xsl: copy узла, перед которым добавляется новый элемент.

XML ДОКУМЕНТ

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <ul>
        <li>book name</li>
        <li>book name</li>
        <li>book name</li>
    </ul>
    <ul id='123'>
        <li>book name</li>
        <li>book name</li>
        <li>book name</li>
    </ul>
</books>

ожидаемый результат

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <ul>
        <li>book name</li>
        <li>book name</li>
        <li>book name</li>
    </ul>
    <anchor id="123"/>
    <ul id='123'>
        <li>book name</li>
        <li>book name</li>
        <li>book name</li>
    </ul>
</books>

Могу ли я сделать это без использования? Элементы с идентификатором будут иметь отдельные шаблоны. Если я использую xsl: copy, специфичные для элемента шаблоны не будут применены. Ваша помощь будет высоко ценится. Заранее спасибо.

1 Ответ

1 голос
/ 13 апреля 2019

Результат, который вы показываете, может быть легко достигнут с помощью:

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="ul[@id]">
    <anchor id="{@id}"/>
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Если у вас есть специальные шаблоны для обработки других элементов, вы можете добавить их, и они будут применены.

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