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>

ご覧のとおり、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>

ここに何か提案はありますか?

4

2 に答える 2

0

XSLT 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 に答える