1

特定の要素内の特定の属性値に基づいて、フィルター属性値のリストを生成するルーチンをまとめました。関数は次のとおりです。

<xsl:template name="have_arch_attrib">

    <!-- We only add a filter attribute IF there is a arch, condition or security attribute-->
    <xsl:choose>
        <xsl:when test=".[@arch] | .[@condition] | .[@security]">
            <xsl:attribute name="filter">
                <xsl:for-each select="@arch | @condition | @security ">

                    <!-- Need to check and convert semis to commas-->
                    <xsl:variable name="temp_string" select="."/>
                    <xsl:variable name="rep_string">
                        <xsl:value-of select="replace($temp_string, ';', ',')"/>
                    </xsl:variable>
                    <xsl:value-of select="$rep_string"/>


                    <!--<xsl:value-of select="." />-->
                    <xsl:if test="position() != last()">
                        <xsl:text>,</xsl:text>
                    </xsl:if>
                </xsl:for-each>
            </xsl:attribute>
        </xsl:when>
    </xsl:choose>
</xsl:template>

ただし、特定の要素については、その要素の親の属性を確認する必要がありました。そこで、上記を次のように書き直しました。

<xsl:template name="parent_has_arch_attrib">

    <!-- We only add a filter attribute IF there is a arch, condition or security attribute-->
    <xsl:choose>
        <xsl:when test="..[@arch] | ..[@condition] | ..[@security]">
            <xsl:attribute name="filter">
                <xsl:for-each select="..[@arch] | ..[@condition] | ..[@security] ">

                    <!-- Need to check and convert semis to commas-->
                    <xsl:variable name="temp_string" select="."/>
                    <xsl:variable name="rep_string">
                        <xsl:value-of select="replace($temp_string, ';', ',')"/>
                    </xsl:variable>
                    <xsl:value-of select="$rep_string"/>


                    <!--<xsl:value-of select="." />-->
                    <xsl:if test="position() != last()">
                        <xsl:text>,</xsl:text>
                    </xsl:if>
                </xsl:for-each>
            </xsl:attribute>
        </xsl:when>
    </xsl:choose>
</xsl:template>

私はこのルーチンに入っていますが、何も出ていません。問題は、select="." を介して temp_string を割り当てるときだと思います。これは現在の要素を取得していると思います。select=".." を試してみると、for-each ループで処理されている現在の属性値だけでなく、すべての属性値が得られます。for-each ループでこのようなことを行うことはできますか、それとも中断する必要がありますか?

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

ラス

4

1 に答える 1

1

この行を置き換える必要があると思います...

<xsl:for-each select="..[@arch] | ..[@condition] | ..[@security] ">

代わりにこの行で

<xsl:for-each select="../@arch | ../@condition | ../@security ">

..[@arch] | ..[@condition] | ..[@security]実際に属性自体を取得しようとしているときに、指定された属性のいずれかが存在する場合、親ノードを選択するだけです。

余談ですが、ここで変数をいじる必要はありません...

                <xsl:variable name="temp_string" select="."/>
                <xsl:variable name="rep_string">
                    <xsl:value-of select="replace($temp_string, ';', ',')"/>
                </xsl:variable>
                <xsl:value-of select="$rep_string"/>

これを次のように単純化できます。

<xsl:value-of select="replace(., ';', ',')"/>
于 2013-08-28T22:27:31.323 に答える