3

私は XSLT を初めて使用するので、助けていただければ幸いです。私はstackoverflowでたくさん検索し、いくつかのアプローチを適用しようとしましたが、失敗しました.

私はこのようなxmlを持っています:

    <?xml version="1.0" encoding="utf-8"?>
       <asset_detail>
          <asset id="1" show_type="Movies">
             <title><![CDATA[Movie]]></title>
             <media_list>
               <media id="11" title="" type="trailer">
                 <version format="m3u8" rel_path="/Content/movie.m3u8"/>
                 <version format="HLS" rel_path="/movies/movie.m3u8"/>
               </media>
               </media_list>
           </asset>
       </asset_detail>

xml 全体をコピーする必要があります。

if media_list/media/version/@format = '**HLS**' I need to replace **@rel_path** with
value: **concat**(existing value of **@rel_path****,** **someVariable**
(I'm passing to xsl as a <xsl:param>)

次のようなものを使用する必要があると思います:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="@*|node()">
        <xsl:param name="someVariable"/>
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="media/version">
        <xsl:attribute name="rel_path">
            <xsl:choose>
                <xsl:when test="./@format = HLS">
                    <xsl:value-of select="concat(rel_path,$someVariable)">
                </xsl:when>
            </xsl:choose>
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

私はそれがうまくいかないことを知っています:)

4

2 に答える 2

1

あなたはかなり近いです。スタイルシートに渡されるグローバル パラメーターは、外側のレベルで宣言する必要があります (output要素の次の兄弟になるように移動します)。HLS フォーマットのマッチングは、テンプレートで直接行うこともできます[@format='HLS']。また、 に end-element マーカーがありませんでしたvalue-of。最後に、一致した要素の属性を直接変更することはできません。したがって、copy以下の要素は、一致した要素を既存の属性 + 更新された形式で放出します。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:param name="someVariable"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="media/version[@format='HLS']">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:attribute name="rel_path">
                <xsl:value-of select="concat(@format,$someVariable)"/>
            </xsl:attribute>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

お役に立てれば。

于 2013-02-23T02:10:59.970 に答える