2016-06-14 15 views
1

低レベルの属性に応じて属性値を与えることができるXSL 1.0コード(XSLTを使用してXMLを変換する)を作成しようとしています。 これを明確にするために、例が有用であるかもしれない:属性に応じて上位XMLノード値を取得

だから、
<age_list> 
    <age i="13"> 
    <type j="min"/> 
    </age> 
    <age i="22"> 
    <type j="max"/> 
    <age_list> 
</age_list> 

、私は私の年齢の属性を抽出したいが、私は、たとえば、いくつかの映画が禁止されている、としてそれはminまたはmax年齢だかどうかを知る必要があります18歳未満の子供の場合は推奨年齢は12歳ですが、 各映画には年齢リストがありますが、すべての年齢リストに最小年齢と最大年齢が含まれているわけではありません。時には最大値、時には最小値、場合によっては両方の値もあります。 minが指定されていない場合は、自動的に0に設定され、maxが指定されていない場合は999に設定されます。 これはどうすれば実現できますか?

私はすべての年齢のリストを反復処理し、次のテストを実行します。

<xsl:choose> 
    <xsl:when test="./age/type[@j='MIN']"> 
     <xsl:value-of select="./age/@j" /> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>0</xsl:text> 
    </xsl:otherwise> 
</xsl:choose> 
<xsl:choose> 
    <xsl:when test="./age/type[@j='MAX']"> 
     <xsl:value-of select="./age/@j" /> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>999</xsl:text> 
    </xsl:otherwise> 
</xsl:choose> 

をしかし、それは最高のために、私は現在の年齢を参照し、属性に依存しないと論理的に聞こえる同じ値minの私になってきましたタイプのj。

答えて

0

XMLとXSLTでは大文字と小文字が区別されます。 XMLでは、j属性の値はminですが、XSLTではMINが異なります。

また

、特定のタイプのage属性のあなたのコード最初のテストが、xsl:whenはあなたが<xsl:value-of select="./age/@j" />を行うときにだけ、のではないものを非常に最初age要素を取得していること、あなたの現在のコンテキストを変更しません必要なタイプ。

代わりにこれを試してみてください:

<xsl:choose> 
    <xsl:when test="age[type/@j='min']"> 
     <xsl:value-of select="age[type/@j='min']/@i" /> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>0</xsl:text> 
    </xsl:otherwise> 
</xsl:choose> 
<xsl:choose> 
    <xsl:when test="age[type/@j='max']"> 
     <xsl:value-of select="age[type/@j='max']/@i" /> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>999</xsl:text> 
    </xsl:otherwise> 
</xsl:choose> 

あなたは、変数

<xsl:variable name="min" select="age[type/@j='min']" /> 
<xsl:choose> 
    <xsl:when test="$min"> 
     <xsl:value-of select="$min/@i" /> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>0</xsl:text> 
    </xsl:otherwise> 
</xsl:choose> 

<xsl:variable name="max" select="age[type/@j='max']" /> 
<xsl:choose> 
    <xsl:when test="$max"> 
     <xsl:value-of select="$max/@i" /> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:text>999</xsl:text> 
    </xsl:otherwise> 
</xsl:choose> 
+0

、ありがとうございますと繰り返し表現を避けることができます!これは流暢に動作します! XSLTの新機能です。そのため、特定のノードの属性や値に到達する方法がわかりません。思考の方法は、プログラミングJavaやそのようなものとはまったく異なっています。 – BlackACE

関連する問題