将 xml 标签替换为 html
Replace xml tags to html
大家好,我想将一些 xml 节点标签替换为 html 标签
示例:<emphasis role="bold">Diff.</emphasis>
我想把它转换成<b>Diff.</b>
示例:<emphasis role="italic">Diff.</emphasis>
我想把它转换成<i>Diff.</i>
有什么想法吗?
正如 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
如果测试输入是:
<?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,您可以通过包含
覆盖 XSLT 的 main
<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>
大家好,我想将一些 xml 节点标签替换为 html 标签
示例:<emphasis role="bold">Diff.</emphasis>
我想把它转换成<b>Diff.</b>
示例:<emphasis role="italic">Diff.</emphasis>
我想把它转换成<i>Diff.</i>
有什么想法吗?
正如 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
如果测试输入是:
<?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,您可以通过包含
覆盖 XSLT 的main
<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>