0

これは基本的な質問かもしれませんが、この初心者は苦労してグーグルで調べていて、理解できていません。

これに似たxmlドキュメントがあります。

 <x99:events xmlns:x99="http://www.foo.com/x99" xmlns:xl="http://www.w3.org/1999/xlink" pubdate="2012-05-29T11:14:14-06:00">
    <x99:event xl:href="event.xml?event_id=255918" id="foo" status="new">
        <x99:event_id>255918</x99:event_id>

        <x99:custom_attribute xmlns:x99="http://www.foo.com/x99" status="new">
            <x99:attribute_id>22</x99:attribute_id>
            <x99:attribute_value>hi there</x99:attribute_value>
        </x99:custom_attribute>

        <x99:custom_attribute xmlns:x99="http://www.foo.com/x99" status="new">
            <x99:attribute_id>26</x99:attribute_id>
            <x99:attribute_value>this is a test</x99:attribute_value>
        </x99:custom_attribute>

        <x99:custom_attribute xmlns:x99="http://www.foo.com/x99" status="new">
            <x99:attribute_id>12</x99:attribute_id>
            <x99:attribute_value>Yes</x99:attribute_value>
        </x99:custom_attribute>
    </x99:event>
</x99:events>

そして、xml を変換する xsl があります。

私の xsl では、custom_attribute ノードをループできる必要があり、attribute_id ごとに、custom_attribute ノードの子ノードに基づいた値を持つノードを作成する必要があることがわかりました。

これが私の擬似コードです。私はこのようなものが必要です。

<xsl:for-each select="x99:custom_attribute">

    <xsl:when test="number(x99:attribute_id) = 22>
        <x99:text>You chose twenty two and your attribute value is <x99:attribute_value></x99:text>
    </xsl:when>

    <xsl:when test="number(x99:attribute_id) = 26>
        <x99:text>Twenty six is a great answer! and your attribute value is <x99:attribute_value></x99:text></x99:text>
    </xsl:when>

</xsl:for-each>

そして、ここに私のxslがあります。

私の xsl スキルは最も基本的なレベルであり、xml もそれほど優れていません。親切な魂が私にアドバイスをくれるでしょうか?私は頭を少し超えています。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
  xmlns:xl="http://www.w3.org/1999/xlink"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xhtml="http://www.w3.org/1999/xhtml"
  xmlns:b="http://www.someurl.com/b"
  xmlns:s="http://www.someurl.com/s"
  xmlns:c="http://foo.com/c"
  xmlns:x99="http://foo.com/x99"
  exclude-result-prefixes="xl x99">

    <xsl:param name="base_url" select="''" />
    <xsl:param name="session_id" select="''" />
    <xsl:param name="TaskDir" select="''" />

    <xsl:template match="/">
        <xsl:call-template name="SendConfirmationEmail">
            <xsl:with-param name="EventID" select="/x99:events/x99:event/x99:event_id"/>
            <xsl:with-param name="SiteURL" select="'https://foobar.com/123Test/#details'" />
        </xsl:call-template>

        <xsl:apply-templates select="node()" />
    </xsl:template>


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


    <xsl:template name="SendConfirmationEmail">
        <xsl:param name="EventID" select="''"/>

        <xsl:result-document>
            <schedule>
                <job>
                    <name>Email Confirmation</name>
                    <active>T</active>
                    <http>
                        <body>
                            <x99:email xmlns:x99="http://foo.com/x99">
                                <x99:mail>
                                    <x99:body>

                                        <x99:text>Your event ID is <xsl:value-of select="$EventID"/></x99:text>


                                        // I want to be able to loop through my x99:attribute_id values here and create new x99:text nodes.


                                    </x99:body>
                                </x99:mail>
                            </x99:email>
                        </body>
                    </http>
                </job>
            </schedule>
        </xsl:result-document>
    </xsl:template>


</xsl:stylesheet>

率直に言って、私は方法を知る必要があります...

  • custom_attribute ノードをループし、ノードごとに x99:text ノードを作成します。
  • 子の attribute_id の値に基づく文字列
  • attribute_value ノードの内容
4

1 に答える 1

0

まず、サブルーチンを呼び出すために CALL を使用して FORTRAN でプログラミングしているかのように、パラメーターを指定した名前付きテンプレートを使用する代わりにevent_id、 などの要素を処理するテンプレートを定義するだけ<xsl:template match="event_id">です。htmlではなく、という意味だと思いますhttp。ドキュメントを配置する場所を認識できるように、要素hrefに属性を指定する必要があります。<xsl:result-document>どうやら x99 名前空間から HTML に要素を書き込んでいるようですが、それは本当にやりたいことですか?

属性要素の「ループ」に関しては、XSLT の考え方では、属性要素を「処理する」と言う方が望ましいでしょう。<x99:text>要素の追加の下で<xsl:apply-templates/>、カスタム属性要素を処理するテンプレートを定義します ( <xsl:template match="x99:custom-attribute">。そのテンプレート内にfor-each、疑似コード内にあるもののようなものを配置しnumber(x99:attribute_id)ます。number(.)そのノード. ただし、<xsl:when>要素は<xsl:choose>.

于 2012-06-07T02:01:11.847 に答える