bugfix> xml > 投稿

現在、実用的な環境で基本的なXSLTを学ぼうとしています-これを変換する最も簡単な方法は何ですか?

<fig id="vid1" position="float" fig-type="video">
<label>Video 1</label>
<caption><p>Test video 1</p></caption>
<media xlink:href="test1.mp4" id="test1" mime-subtype="mp4" content-type="play-in-place"/>
</fig>

このフォーマットに、すべての変換で出力されるボイラープレートテキスト(外部ホストファイル名、ビデオプレーヤー)を追加します。

<media id="vid1" xlink:href="test1.mp4" xlink:role="external-host-filename" content-type="play-in-place">
<object-id pub-id-type="media-player-id">Video Player</object-id>
<object-id pub-id-type="other" content-type="media-stream-id">test 1</object-id>
<label>Video 1</label>
<caption><p>Test video 1</p></caption>
</media>

どんな入力でも素晴らしいでしょう、ありがとう!

回答 1 件
  • ソースXMLから始めましょう。 あなたが書いたように、複数  fig  ノード、それらは埋め込まれる必要があります いくつかでシングル ルート要素、私はそれを root と呼びました 。

    もう1つの要件は、使用する各ネームスペースをどこかで宣言する必要があることです。 例えばルート要素内。

    したがって、ソースXMLには、簡単にするために1つの(あなたの) fig  素子 以下のようにすることができます:

    <root xmlns:xlink="urn:xlink">
      <fig id="vid1" position="float" fig-type="video">
        <label>Video 1</label>
        <caption><p>Test video 1</p></caption>
        <media xlink:href="test1.mp4" id="test1" mime-subtype="mp4" content-type="play-in-place"/>
      </fig>
    </root>
    
    

    次に、XSLTスクリプトに進みます。

    まず第一に、あなたはオープニング stylesheet で繰り返す必要があります  鬼ごっこ 使用される各ネームスペース、例: xmlns:xlink="urn:xlink"

    定型テキストを定義するには、 xsl:param を使用できます  要素、 名前と値の定義、例:

    <xsl:param name="role" select="'external-host-filename'"/>
    <xsl:param name="Object1" select="'Video Player'"/>
    
    

    次に、 fig に一致するテンプレートを作成する必要があります 、 media の生成  素子 適切な属性とコンテンツを使用します。例えば。 id を作成するには  記述できる属性:

    <xsl:attribute name="id" select="@id"/>
    
    

    場合によっては、ソースから属性をコピーできます。

    <xsl:copy-of select="media/@content-type"/>
    
    

    そして今、発明の一部:あなたの出力が含まれているように  object-id 要素、必要なものを生成する単一のテンプレートを書きましょう 仮パラメータ:

    <xsl:template name="object">
      <xsl:param name="pub-type"/>
      <xsl:param name="content-type" required="no"/>
      <xsl:param name="content"/>
      <object-id>
        <xsl:attribute name="pub-id-type" select="$pub-type"/>
        <xsl:if test="$content-type != ''">
          <xsl:attribute name="content-type" select="$content-type"/>
        </xsl:if>
        <xsl:value-of select="$content"/>
      </object-id>
    </xsl:template>
    
    

    適切な実際のパラメータを使用して2回呼び出します(以下を参照)。

    このテンプレートの最後の部分は、2つのソース要素をコピーすることです copy-of を使用した出力 。 スクリプトを短くするために、単一の copy-of で記述しました  ステートメント。

    そして、忘れないでくださいアイデンティティーテンプレート

    したがって、スクリプト全体は次のようになります。

    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:xlink="urn:xlink">
      <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
      <xsl:param name="role" select="'external-host-filename'"/>
      <xsl:param name="Object1" select="'Video Player'"/>
      <xsl:template match="fig">
        <media>
          <xsl:attribute name="id" select="@id"/>
          <xsl:attribute name="xlink:href" select="media/@xlink:href"/>
          <xsl:attribute name="xlink:role" select="$role"/>
          <xsl:copy-of select="media/@content-type"/>
          <xsl:call-template name="object">
            <xsl:with-param name="pub-type" select="'media-player-id'"/>
            <xsl:with-param name="content" select="$Object1"/>
          </xsl:call-template>
          <xsl:call-template name="object">
            <xsl:with-param name="pub-type" select="'other'"/>
            <xsl:with-param name="content-type" select="'media-stream-id'"/>
            <xsl:with-param name="content" select="'test 1'"/>
          </xsl:call-template>
          <xsl:copy-of select="label, caption"/>
        </media>
      </xsl:template>
      <xsl:template name="object">
        <xsl:param name="pub-type"/>
        <xsl:param name="content-type" required="no"/>
        <xsl:param name="content"/>
        <object-id>
          <xsl:attribute name="pub-id-type" select="$pub-type"/>
          <xsl:if test="$content-type != ''">
            <xsl:attribute name="content-type" select="$content-type"/>
          </xsl:if>
          <xsl:value-of select="$content"/>
        </object-id>
      </xsl:template>
      <xsl:template match="@*|node()">
        <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
      </xsl:template>
    </xsl:stylesheet>
    
    

    実際の例については、http://xsltransform.net/nb9MWtnを参照してください

あなたの答え