2013-08-14 2 views
0

У меня есть XHTML, который выглядит, как этотИзменение атрибута размера шрифта в тегах XHTML через XSLT

<span style="font-size:8px;"><font size="3"><strong style="font-size:14pt;">EXAM: </strong>Head</font></span> 

И я хочу, чтобы удалить весь размер шрифта атрибутов, так что это выглядит

<strong>EXAM: </strong>Head 

Я попытался

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

Но это удаляет весь узел. Какие-либо предложения?

ответ

0

Шаблон с match="font size" не должен соответствовать чему-либо вообще, но шаблон, который вы показываете, должен скопировать элемент, который он соответствует, и все атрибуты этого элемента, а также обрабатывать все дочерние узлы этого элемента. Поэтому, если шаблон, который вы показываете, фактически запускает, он не должен вообще удалять какие-либо узлы из ввода. Я полагаю, что то, что вы вставили, не является точным отражением кода, который вы используете, или же вы неправильно интерпретируете поведение, которое вы наблюдаете.

Вы говорите, что хотите «удалить все атрибуты шрифта», которые я использую для обозначения всех атрибутов style, единственной функцией в жизни которых является перенос свойства размера шрифта. Однако в вашем образце вы также удалили элементы span и font. Я полагаю, что этот пример следует верить.

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

Сначала вы хотите отключить атрибуты style, если все они содержат значение font-size. На самом деле это нелегко сделать надежно в общем случае без написания парсера CSS в вашем XSLT, но давайте предположим, что вы можете пройти с более простым тестом: если атрибут style начинается с установки размера шрифта, он умирает.

Если вы используете нормальное преобразование идентичности, подобное тому, которое указано в спецификации XSLT 1.0, в вашем преобразовании уже есть правило для обработки атрибутов. Мы хотим переопределить его для этого набора атрибутов стиля, которые мы хотим полностью подавить. Напишите:

<xsl:template match="@style[starts-with(.,'font-size')]"/> 

Во-вторых, вы хотите подавить элементы диапазона, которые несут атрибуты стиля, которые начинаются с настроек размера шрифта. (На самом деле, более умный тест может также проверить отсутствие атрибута «class» и другие вещи, я оставлю это как упражнение для читателя.) Здесь вы не хотите подавлять контент, но вы не хотите, t хочет элемент в выходе. Таким образом, содержание шаблона просто призыв применить-шаблоны:

<xsl:template match="xh:span 
        [starts-with(@style,'font-size')]"> 
    <xsl:apply-templates/> 
</xsl:template> 

Наконец, вы хотите сделать то же самое с элементами шрифта: процесс их содержимое, но уронить сам элемент:

<xsl:template match="xh:font"> 
    <xsl:apply-templates/> 
</xsl:template> 

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

+0

Это сработало чудесно! Большое спасибо за объяснение. У меня было ощущение, что я пытаюсь достичь чего-то сверх простого преобразования. – user2683654

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