2

このようなxmlドキュメントがあります。

<?xml version="1.0"?>
<services>
    <service sn="1" family="2 Week Wait">
    <service_name>2 Week Wait Dermatology</service_name>
    <speciality>2 Week Wait</speciality>
    <clinic_types>2 Week Wait Skin</clinic_types>
    <tag>Malignant neoplasm of skin , Pigmented skin lesion </tag>
</service>

思い通りにすべてを取得できましたが、最後の微調整として、カンマ区切り値を順序なしリストとして表示したいと思います。

このXSLの行を使用して、リストを出力しています。

<ul>
     <li>
           <xsl:value-of select="translate(tag,',','<![CDATA[</li><li>]]>')" disable-output-escaping="yes" />
     </li>
<ul>

結果のXMLが正しくフォーマットされていないというエラーが表示されます。交換セクションを他のものに交換しようとしましたが、うまくいきました。また、タグにHTML ASCIIコードを使用しようとしましたが、運が悪かったので、間違っていることに本当に混乱しています。

助けてくれてありがとう、ありがとう

4

2 に答える 2

2

XSLTはXMLです。式は属性値内に埋め込まれてselectいるため、XMLエスケープの別のラウンドを適用する必要があります。CDATAセクションは属性値に存在できないため、手動で適用する必要があります。

<xsl:value-of select="translate(tag,',','&lt;/li>&lt;li>')" disable-output-escaping="yes" />

ただし、disable-output-escapingの出力に適用することにtranslateは疑問があります。テキストに文字が含まれている場合はどう<なる&でしょうか。有効性と潜在的なセキュリティ問題を伴う、テキストコンテンツをアクティブなマークアップに変えることになります。

通常は、XSLT自体からマークアップを追加することをお勧めします。tokenize次の関数を使用して、XSLT2.0で文字列を分割できます。

<ul>
    <xsl:for-each select="tokenize(tag,',')">
        <li><xsl:value-of select="."/></li>
    </xsl:for-each>
</ul>

substring_before(XSLT 1.0を使用している場合、これは/を使用して再帰的なテンプレートとして実行する必要がありますがafter、これは面倒です。)

于 2010-10-29T10:41:02.613 に答える
-1
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:template match="tag">
        <ul>
                <xsl:for-each select="tokenize(.,',')">
                    <li><xsl:value-of select="."/></li>
                </xsl:for-each>
            </ul>
</xsl:template>

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
于 2021-07-24T16:10:49.793 に答える