2012-10-23 3 views
1

Никогда раньше XSLT не делал. Возможно ли наследовать документ и заменить только один тег? Если да, можете ли вы представить какой-либо пример, пожалуйста?Наследование XSLT. Замена тегов HTML?

Спасибо

+0

нужна больше информации –

+0

Да, и есть много много примеров того, как сделать это на SO и в других местах. ключевой концепцией для поиска является шаблон _identity_ - низкоприоритетная templat e, который просто копирует свой вход в выходной файл без изменений, который затем можно переопределить с помощью более конкретных шаблонов для всего, с чем вы хотите обращаться по-разному. –

+0

Пример кода? Могу ли я просто пометить один тег и переопределить его в дочернем xslt doc? Или мне нужно повторить структуру? Ян, любая ссылка? – Sergejs

ответ

3

Вы начинаете с шаблоном

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

то добавить шаблоны для преобразования узлов вы хотите преобразовать, например,

<xsl:template match="td"> 
    <th> 
    <xsl:apply-templates select="@* | node()"/> 
    </th> 
<xsl:template> 

преобразует все элементы в tdth элементов или

<xsl:template match="h6"/> 

удаляет все элементы h6.

Если вы хотите, чтобы преобразовать один td, то вам нужно каким-то образом, чтобы идентифицировать его, предполагая, что он имеет атрибут id использовать шаблон соответствия как

<xsl:template match="td[@id = 'td1']"> 
    <td style="background-color: lightgreen;"> 
    <xsl:apply-templates select="@* | node()"/> 
    </td> 
</xsl:template> 

Этот образец устанавливает свойство конкретного td CSS background-color элемент.

0

Эта задача лучше обрабатывается с наиболее фундаментальным шаблоном проектирования XSLT: использование и опрокинув identity rule:

Давайте этот XML-документ:

<root> 
    <x>This is:</x> 
    <a> 
     <b> 
     <c>hello</c> 
     </b> 
    </a> 
    <a> 
     <b> 
     <c1>world</c1> 
     </b> 
    </a> 
    <a> 
     <b>!</b> 
    </a> 
    <y>The End</y> 
</root> 

Задачей является:

  1. Удалить все c элементов.

  2. Переименуйте любой b элемент в d.

  3. Вставьте элемент c2 после любого элемента c1.

Решение удивительно короткий и простой:

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

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

<xsl:template match="c"/> 

<xsl:template match="b"> 
    <d><xsl:apply-templates select="node()|@*"/></d> 
</xsl:template> 

<xsl:template match="c1"> 
    <xsl:call-template name="identity"/> 
    <c2>xxx</c2> 
</xsl:template> 
</xsl:stylesheet> 

когда это преобразование применяется на вышеуказанном документе XML, разыскиваемый, правильный результат получается:

<root> 
    <x>This is:</x> 
    <a> 
     <d/> 
    </a> 
    <a> 
     <d> 
     <c1>world</c1> 
     <c2>xxx</c2> 
     </d> 
    </a> 
    <a> 
     <d>!</d> 
    </a> 
    <y>The End</y> 
</root> 

Пояснение:

  1. Шаблон идентификации, выбранный для выполнения или вызываемый по имени, копирует текущий узел «как есть».

  2. Для каждой специальной задачи (удаление, вставка и переименование, добавим отдельный шаблон, соответствующий нужный узел и тем самым подменяет шаблон идентичности, из-за более высокой специфичности.

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

Смежные вопросы