2013-03-07 39 views
0

穿越我有这样的XML -如何禁用后输出转义

<DOCUMENT> 
<SERVICE> 
<ID>1338</ID> 
<NAME> 
&lt;EN&gt;this is an english name&lt;/EN&gt; 
&lt;DE&gt;this is a german name&lt;/DE&gt; 
</NAME> 
</SERVICE> 
</DOCUMENT> 

正如你所看到的名称标签内的元素是XML等,但没有真正格式化为元素。输出XML需要看起来像

<SERVICES> 
<SERVICE ID="1338" EN="this is an english name" DE="this is a german name"/> 
</SERVICES> 

我想通过XPATH获取EN和DE的值。我试图摆脱禁用输出转义,但我不认为这会奏效。

<xsl:template match="/"> 
<SERVICES> 
<SERVICE> 
<xsl:attribute name="ID"><xsl:value-of select="DOCUMENT/SERVICE/ID"/></xsl:attribute> 
<xsl:attribute name="EN"><xsl:value-of select="DOCUMENT/SERVICE/NAME/EN" disable-output-escaping="yes"/></xsl:attribute> 
<xsl:attribute name="DE"><xsl:value-of select="DOCUMENT/SERVICE/NAME/DE" disable-output-escaping="yes"/></xsl:attribute> 
</SERVICE> 
</SERVICES> 
</xsl:template> 

此处有任何建议吗?

+0

你认为substring()可以在这里应用吗?或者你的源代码是否太动态?您是否尝试过输出转义? – JWiley 2013-03-07 16:53:26

+0

您使用哪种XSLT处理器?它是否具有像Saxon 9这样的扩展功能,例如http://www.saxonica.com/documentation/functions/intro/parse-xml.xml? – 2013-03-07 17:43:07

+0

我没有像Saxon9这样的扩展..它是我们的搜索引擎中的一个普通的内置转换服务器。 – user1766784 2013-03-07 17:48:39

回答

0

首选的方法是获取NAME元素的字符串内容,并将其通过XML解析器转换为节点树。如果处理器支持诸如saxon:parse()(或XPath 3.0 parse-xml())的扩展,或者通过调用扩展函数,则可以完成此操作。

如果内部XML非常刻板且可预测,那么您可以通过直接字符串操作来解析它。

0

如果您能够使用XSLT 2.0,请利用其一些解析函数。您可以使用analyze-string来提取您需要的数据。

下面应该是一个完整的工作转换。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:template match="/"> 
     <DOCUMENT> 
      <SERVICES> 
       <xsl:for-each select="DOCUMENT/SERVICE"> 
        <SERVICE> 
         <xsl:attribute name="ID"><xsl:value-of select="ID"/></xsl:attribute> 
         <xsl:analyze-string select="NAME" regex="&lt;(.*?)&gt;(.*?)&lt;/\1&gt;"> 
          <xsl:matching-substring> 
           <xsl:attribute name="{regex-group(1)}" select="regex-group(2)"/> 
          </xsl:matching-substring> 
         </xsl:analyze-string> 
        </SERVICE> 
       </xsl:for-each> 
      </SERVICES> 
     </DOCUMENT> 
    </xsl:template> 
</xsl:stylesheet> 
+0

谢谢。但我使用XSLT 1.0,所以这个答案不会帮助我太多,我害怕。 – user1766784 2013-03-07 17:48:07