我有这样的XML -
<DOCUMENT>
<SERVICE>
<ID>1338</ID>
<NAME>
<EN>this is an english name</EN>
<DE>this is a german name</DE>
</NAME>
</SERVICE>
</DOCUMENT>
正如您所看到的,name标签内的元素是XML,但并未真正格式化为元素。输出XML需要看起来像
<SERVICES>
<SERVICE ID="1338" EN="this is an english name" DE="this is a german name"/>
</SERVICES>
我试图通过XPATH获取EN和DE的值。我试图使用disable-output-escaping进行游戏,但我认为这不会起作用。
<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 :(得分: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="<(.*?)>(.*?)</\1>">
<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>
答案 1 :(得分:0)
首选方法是获取NAME元素的字符串内容,并通过XML解析器将其转换为节点树。如果您的处理器支持扩展名,例如saxon:parse()(或XPath 3.0 parse-xml()),或者通过调用扩展函数,则可以执行此操作。
如果内部XML非常刻板和可预测,那么您也许可以通过直接字符串操作来解析它。