如何正确使用xsl:analyze-string和regex?

时间:2013-11-19 18:49:04

标签: xml regex xslt

我需要开发一个xsl来转换错误形成的xml文档。我从命令行使用Saxon 9.5。我对xsl有一些经验,但无法制定解决方案。

下面是示例xml:

<DATETIME_BEGIN>
   &lt;Year&gt;2006&lt;/Year&gt;
   &lt;Month&gt;2&lt;/Month&gt;
   &lt;Day&gt;8&lt;/Day&gt;
   &lt;Hour&gt;12&lt;/Hour&gt;
   &lt;Minutes&gt;50&lt;/Minutes&gt;
 <Seconds>49</Seconds>
</DATETIME_BEGIN>
<QUOTE_TEXT>
  &lt;Statement&gt;&quot;Some quoted text here&quot;&lt;/Statement&gt;
</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='"&lt;"'>
       <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>

1 个答案:

答案 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>