我在marklogic中使用XSLT将XML转换为HTML。
这是我的xslt:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="ISO-8859-1" indent="no"/>
<xsl:template match="/">
<html>
<head>
<title>title</title>
</head>
<body>
<xsl:apply-templates />
</body>
</xsl:template>
<xsl:template match="ph">
<xsl:text disable-output-escaping="yes"></p></xsl:text>
<!-- converting inline ph to display para-->
<p><xsl:apply-templates /></p>
<xsl:text disable-output-escaping="yes"><p class="para-continued"></xsl:text>
</xsl:template>
</xsl:stylesheet>
我的样本xml:
<doc>
<p>some text bla blasome text bla blasome text bla blasome text bla bla</p>
<p>some text bla blasome text <ph>ph content</ph> bla blasome text bla blasome text bla bla</p>
</doc>
在MarkLogic中使用<xsl:text>
时,标签以HTML格式显示,Oxygen没有任何问题,请参阅附图。
答案 0 :(得分:1)
签入ErrorLog.txt
,你会看到类似的内容:
XSLT-DISOUTPUTESC (err:XTRE1620) Disable output escaping not supported: /*:stylesheet/*:template[2]/*:text[1]
换句话说,MarkLogic的当前版本没有实现该功能。它是可选的:http://www.w3.org/TR/xslt20/#d-o-e-in-data-model
你可以尝试这样的事情。请注意,我已经将花括号加倍以在XQuery中转义它们。这也许是使用xsl:for-each-group
的好地方。
xdmp:xslt-eval(
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="ISO-8859-1" indent="no"/>
<xsl:template match="/">
<html>
<head>
<title>title</title>
</head>
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="*[ph]">
<xsl:variable name="qname" select="node-name(.)"/>
<xsl:element name="{{ $qname }}">
<xsl:apply-templates select="ph[1]/preceding-sibling::node()"/>
</xsl:element>
<xsl:element name="{{ $qname }}">
<xsl:apply-templates select="ph[1]/node()"/>
</xsl:element>
<xsl:element name="{{ $qname }}">
<xsl:attribute name="class">para-continued</xsl:attribute>
<xsl:apply-templates select="ph[1]/following-sibling::node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="*">
<xsl:element name="{{ node-name(.) }}">
<xsl:apply-templates select="node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>,
<doc>
<p>some text bla blasome text bla blasome text bla blasome text bla bla</p>
<p>some text bla blasome text
<ph>ph content</ph>
bla blasome text bla blasome text bla bla
</p>
</doc>)
使用7.0-4.3:
<doc>
<p>some text bla blasome text bla blasome text bla blasome text bla bla</p>
<p>some text bla blasome text</p>
<p>ph content</p>
<p class="para-continued">
bla blasome text bla blasome text bla bla
</p>
</doc>
答案 1 :(得分:1)
我建议使用xsl:for-each-group
,这样可以提供更灵活,更强大的解决方案:
let $xml := document {
<doc>
<p>1some text bla blasome text bla blasome text bla blasome text bla bla</p>
<p>2some text bla blasome text <ph>ph content</ph> 3bla blasome text bla blasome text bla bla</p>
</doc>
}
let $xsl :=
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="ISO-8859-1" indent="no"/>
<xsl:template match="/doc">
<html>
<head>
<title>title</title>
</head>
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[ph]">
<xsl:variable name="parent" select="."/>
<xsl:for-each-group select="node()" group-starting-with="node()[self::ph | preceding-sibling::node()[1][self::ph]]">
<xsl:element name="{{node-name($parent)}}">
<xsl:copy-of select="$parent/@*"/>
<xsl:apply-templates select="current-group()"/>
</xsl:element>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
return xdmp:xslt-eval($xsl, $xml)
HTH!