我需要开发一个xsl来转换错误形成的xml文档。我从命令行使用Saxon 9.5。我对xsl有一些经验,但无法制定解决方案。
下面是示例xml:
<DATETIME_BEGIN>
<Year>2006</Year>
<Month>2</Month>
<Day>8</Day>
<Hour>12</Hour>
<Minutes>50</Minutes>
<Seconds>49</Seconds>
</DATETIME_BEGIN>
<QUOTE_TEXT>
<Statement>"Some quoted text here"</Statement>
</QUOTE_TEXT>
期望的结果:
<DATETIME_BEGIN>
<Year>2006</Year>
<Month>2</Month>
<Day>8</Day>
<Hour>12</Hour>
<Minutes>50</Minutes>
<Seconds>49</Seconds>
</DATETIME_BEGIN>
<QUOTE_TEXT>
<Statement>"Some quoted text here"</Statement>
</QUOTE_TEXT>
我尝试过使用xsl:analyze-string但没有运气。有人可以解释如何使用xsl:analyze-string和/或指向正确的方向吗?
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" method="text"/>
<xsl:variable name="vText" select="replace(unparsed-text('file:///c:/temp/example.xml'),'\r','')"/>
<xsl:template match="/">
<xsl:analyze-string select="$vText" regex='"<"'>
<xsl:matching-substring>
<xsl:text disable-output-escaping="yes"><![CDATA[<]]></xsl:text>
</xsl:matching-substring>
<xsl:non-matching-substring><xsl:sequence select="."/></xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:0)
根据您的输入文档,仅disable-output-escaping
就可以轻松解决此问题。
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<xsl:template match="QUOTE_TEXT/text() | DATETIME_BEGIN/text()">
<xsl:value-of select="." disable-output-escaping="yes" />
</xsl:template>
给出
<DATETIME_BEGIN>
<Year>2006</Year>
<Month>2</Month>
<Day>8</Day>
<Hour>12</Hour>
<Minutes>50</Minutes>
<Seconds>49</Seconds>
</DATETIME_BEGIN>
<QUOTE_TEXT>
<Statement>"Some quoted text here"</Statement>
</QUOTE_TEXT>