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>

这里有什么建议吗?

4

2 回答 2

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>
于 2013-03-07T17:45:28.460 回答
0

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

如果内部 XML 是非常定型和可预测的,那么您也许可以通过直接字符串操作来解析它。

于 2013-03-07T17:47:42.650 回答