2015-01-06 2 views
0

Привет всем Я Wnt заменить некоторые XML-узел тегов для HTML-тегиЗаменить XML-теги в HTML

Пример: <emphasis role="bold">Diff.</emphasis>

я хочу, чтобы преобразовать его в <b>Diff.</b>

Пример: <emphasis role="italic">Diff.</emphasis>

Я хочу преобразовать его в <i>Diff.</i>

Любые идеи?

+2

Похоже, работа для XSLT –

+0

@SanthoshNayak: Вы можете привести (экстенсивный) потребительная случай поэтому мы можем проверить поведение? –

+0

@CommuSoft У меня есть xml-файл, я должен преобразовать его в html .. поэтому я конвертирую теги узлов XML в связанные теги html. –

ответ

3

Как this answer предлагает XSLT является стандартом де-факто для обработки XML из одного формата в другой.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="//emphasis[@role='bold']"> 
     <b><xsl:apply-templates select="node()" /></b> 
    </xsl:template> 
    <xsl:template match="//emphasis[@role='italic']"> 
     <i><xsl:apply-templates select="node()" /></i> 
    </xsl:template> 
</xsl:stylesheet> 

XSLT делает использование XPath запросов для запроса и обработки контента. Например, //emphasis[@role='bold'] соответствует любому тегу (независимо от глубины), который имеет атрибут role со значением 'bold', в таких блоках вы указываете, как его обрабатывать. Представляя его в пределах <b>...</b> блоков, XSLT также представит вывод в этих блоках. И select="node()" вставляет содержимое узла.

Пример: сказать, приведенный выше код хранится в process.xslt, можно обработать это с помощью xsltproc (или другой XSLT-процессор):

xsltproc process.xslt testinput.xml 

Если testinput является:

<?xml version="1.0"?> 
<test> 
<emphasis role="italic"><foo>Diff<emphasis role="italic">bar</emphasis></foo>.</emphasis> 
<emphasis role="bold">Diff.</emphasis> 
</test> 

в результате выход:

$ xsltproc process.xslt testinput.xml 
<?xml version="1.0" encoding="ISO-8859-15"?> 
<test> 
<i><foo>Diff<i>bar</i></foo>.</i> 
<b>Diff.</b> 
</test> 

Чтобы вывести его как HTML, вы можете переопределить main в XSLT, включив

<xsl:template match="/"> 
    <html> 
    <head> 
    <title>Some title</title> 
    </head> 
    <body> 
    <xsl:apply-templates/> 
    </body> 
    </html> 
</xsl:template> 

в <xsl:stylesheet>. В этом случае выход:

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15"> 
<title>Some title</title> 
</head> 
<body><test> 
<i><foo>Diff<i>bar</i></foo>.</i> 
<b>Diff.</b> 
</test></body> 
</html>