Есть некий xml документ, в нём присутсвует элемент (пускай будет <foo>). Хочеться
что-бы парсер по заданному шаблону xsl прошелся и во всём документе заменил
вхождения тега <foo> по заданному шаблону.
Как этого добиться
Пробовал так. не помогает.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" encoding="ascii"/>
<xsl:template match="/">
<xsl:apply-templates select="//foo" />
</xsl:template>
<xsl:template match="foo">
It seemed as worked heehe
</xsl:template>
</xsl:stylesheet>
Здравствуйте, MrOrbit, Вы писали:
MO>Есть некий xml документ, в нём присутсвует элемент (пускай будет <foo>). Хочеться MO>что-бы парсер по заданному шаблону xsl прошелся и во всём документе заменил MO>вхождения тега <foo> по заданному шаблону.
MO>Как этого добиться MO>Пробовал так. не помогает. MO>
MO><?xml version="1.0" encoding="UTF-8"?>
MO><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
MO><xsl:output omit-xml-declaration="yes" encoding="ascii"/>
MO><xsl:template match="/">
MO> <xsl:apply-templates select="//foo" />
MO></xsl:template>
MO><xsl:template match="foo">
MO> It seemed as worked heehe
MO></xsl:template>
MO></xsl:stylesheet>
MO>
Да и ещё, хотелось бы чтобы основная структура XML осталась прежней, просто изменились необходимые мне теги.
MO>>Есть некий xml документ, в нём присутсвует элемент (пускай будет <foo>). Хочеться MO>>что-бы парсер по заданному шаблону xsl прошелся и во всём документе заменил MO>>вхождения тега <foo> по заданному шаблону.
MO>>Как этого добиться MO>>Пробовал так. не помогает. MO>>
MO>><?xml version="1.0" encoding="UTF-8"?>
MO>><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
MO>><xsl:output omit-xml-declaration="yes" encoding="ascii"/>
MO>><xsl:template match="/">
MO>> <xsl:apply-templates select="//foo" />
MO>></xsl:template>
MO>><xsl:template match="foo">
MO>> It seemed as worked heehe
MO>></xsl:template>
MO>></xsl:stylesheet>
MO>>
MO>Да и ещё, хотелось бы чтобы основная структура XML осталась прежней, просто изменились необходимые мне теги.
Здравствуйте, ibnTeo, Вы писали:
MO>>>Есть некий xml документ, в нём присутсвует элемент (пускай будет <foo>). Хочеться MO>>>что-бы парсер по заданному шаблону xsl прошелся и во всём документе заменил MO>>>вхождения тега <foo> по заданному шаблону.
MO>>>Как этого добиться MO>>>Пробовал так. не помогает. MO>>>
MO>>><?xml version="1.0" encoding="UTF-8"?>
MO>>><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
MO>>><xsl:output omit-xml-declaration="yes" encoding="ascii"/>
MO>>><xsl:template match="/">
MO>>> <xsl:apply-templates select="//foo" />
MO>>></xsl:template>
MO>>><xsl:template match="foo">
MO>>> It seemed as worked heehe
MO>>></xsl:template>
MO>>></xsl:stylesheet>
MO>>>
MO>>Да и ещё, хотелось бы чтобы основная структура XML осталась прежней, просто изменились необходимые мне теги.
T>Примерно так: T>
Обрабатываем все узлы (т.е. копирование структуры), атрибуты и текст в узлах.
Использовать <xsl:copy-of select="*"/> нельзя, т.к. не будет возможности внести изменения в структуру.
T>><xsl:template match="foo">...</xsl:template>
Этот темплейт располагается ниже, поэтому предпочтение ему при встрече узла foo, а не "*|@*|text()"
MO>К сожалению это не работает. Но может пояснишь идею?? Тогда сварганим что-нибудь работающее.
Это рабочая конструкция, если не работает, то по другой причине.
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, MrOrbit, Вы писали:
MO>>К сожалению это не работает. Но может пояснишь идею?? Тогда сварганим что-нибудь работающее.
L>А что конкретно не работает?
Шаблон применяется и выход равен входу. То есть результирующий xml такой же как и входной, без измненений.
Здравствуйте, ibnTeo, Вы писали:
T>>>Примерно так: T>>><xsl:template match="/"> T>>> <xsl:apply-templates select="*"/> T>>></xsl:template>
T>Вызываем корневой узел (копировать структуру же надо).
T>>><xsl:template match="*|@*|text()"><xsl:copy><xsl:apply-templates select="*|@*|text()"/></xsl:copy></xsl:template>
T>Обрабатываем все узлы (т.е. копирование структуры), атрибуты и текст в узлах. T>Использовать <xsl:copy-of select="*"/> нельзя, т.к. не будет возможности внести изменения в структуру. Это ты здорово придумал, а я сходу не догадался как мне обойти это ограничение
T>>><xsl:template match="foo">...</xsl:template>
T>Этот темплейт располагается ниже, поэтому предпочтение ему при встрече узла foo, а не "*|@*|text()"
MO>>К сожалению это не работает. Но может пояснишь идею?? Тогда сварганим что-нибудь работающее.
T>Это рабочая конструкция, если не работает, то по другой причине.
Вообщем, чтобы не играть в испорченный телефон, кину код
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="Test.xsl"?>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>
<foo>Hello World</foo>
</title>
</head>
<body>
<div>
</div>
<foo>
some unuseful information here
</foo>
</body>
</html>
T>>><xsl:template match="*|@*|text()"><xsl:copy><xsl:apply-templates select="*|@*|text()"/></xsl:copy></xsl:template>
T>Обрабатываем все узлы (т.е. копирование структуры), атрибуты и текст в узлах. T>Использовать <xsl:copy-of select="*"/> нельзя, т.к. не будет возможности внести изменения в структуру.
T>>><xsl:template match="foo">...</xsl:template>
T>Этот темплейт располагается ниже, поэтому предпочтение ему при встрече узла foo, а не "*|@*|text()"
А почему? Я вот вычитал в стандарте на w3.org/xslt
The order in which the children of the xsl:stylesheet element occur is not significant except for xsl:import elements
Здравствуйте, ibnTeo, Вы писали:
T>>><xsl:template match="foo">...</xsl:template>
T>Этот темплейт располагается ниже, поэтому предпочтение ему при встрече узла foo, а не "*|@*|text()"
Не правда твоя. Кури спеку по поводу вычисления приоритета.
T>>>><xsl:template match="foo">...</xsl:template>
T>>Этот темплейт располагается ниже, поэтому предпочтение ему при встрече узла foo, а не "*|@*|text()"
L>Не правда твоя. Кури спеку по поводу вычисления приоритета.
А действительно ведь. Всего не перечитаешь, многие вещи быстрее на практике осваивать. А я всё время думал по-другому (и делал), и при этом всё работало
Ну по крайней мере при двух одинаковых темплейтах предпочтение будет у последнего. Удобно иногда так отлаживать.
Здравствуйте, ibnTeo, Вы писали:
T>А действительно ведь. Всего не перечитаешь, многие вещи быстрее на практике осваивать. А я всё время думал по-другому (и делал), и при этом всё работало
T>Ну по крайней мере при двух одинаковых темплейтах предпочтение будет у последнего. Удобно иногда так отлаживать.
Там это тоже прописано:
It is an error if this leaves more than one matching template rule. An XSLT processor may signal the error; if it does not signal the error, it must recover by choosing, from amongst the matching template rules that are left, the one that occurs last in the stylesheet.