2013-05-07 4 views
2

Я хотел бы извлечь все между элементами тега <head> на странице html. Включая теги ссылок и теги скриптов.Извлечь элементы HTML с помощью XSLT

Предположим, что исходный код ниже - это фрагмент, который будет частью полного html-документа.

Источник:

... 
<head> 
<link rel="stylesheet" href="style.css" 
    type="text/css" media="handheld" /> 

<link rel="stylesheet" href="style.css" 
    type="text/css" media="handheld" /> 

<script type="text/javascript" src="main.js"></script> 
<script type="text/javascript" src="second.js"></script> 
</head> 
... 

XSLT:

<xsl:output method="xml" encoding="utf-8" indent="no"/> 

<xsl:template match="/"> 
    <xsl:copy-of select="link"/> 
</xsl:template> 

Это прекрасно работает, если есть только один тег, я пытаюсь получить. Есть ли способ, которым я могу обрабатывать все и только все, что есть между «головными» тегами.

Выход я ожидал бы:

<link rel="stylesheet" href="style.css" 
    type="text/css" media="handheld" /> 

<link rel="stylesheet" href="style.css" 
    type="text/css" media="handheld" /> 

<script type="text/javascript" src="main.js"></script> 
<script type="text/javascript" src="second.js"></script> 
+0

Можете ли вы предоставить более полный пример исходного документа и пример вашего ожидаемого результата? – 2013-05-07 17:38:30

+0

В общем, вы можете использовать XSL только на XML-совместимых данных, таких как XHTML. Если ваш вход не XHTML, вы, вероятно, в какой-то момент, вероятно, получите исключения синтаксического анализа. –

ответ

2

Вы должны использовать XSL тождественное преобразование

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

вместе с шаблоном, который предотвращает выход все, что вы не хотите.

<xsl:template match="/"> 
    <xsl:apply-templates select="html/head"/> 
</xsl:template> 

Второй шаблон, будучи более специфичным, будет соответствовать корень, а затем применить таблицу стилей к содержимому <head> тега. Преобразование идентичности выведет нужные теги.

+0

+1 для гораздо более элегантного ответа, чем полагаться на ''. – ABach

0

Вы должны использовать «XSL: для-каждого» заявление

<xsl:template match="/"> 
     <xsl:for-each select="head/*"> 
     <xsl:copy-of select="."/> 
     </xsl:for-each> 
    </xsl:template> 
0

Я думаю, вы можете использовать <xsl:for-each> элемент для выбора каждого XML-элемента определенного набора узлов.

Просто проведите по всем элементам внутри тега head, а затем используйте функцию xsl-current(), чтобы получить значение каждого элемента таким образом, как это; <xsl:value-of select="current()"/>