1

これが私の XML の外観です。もちろん、リンクごとに異なる名前/タイトルを持つ他のXMLファイルへのリンクの束をレイアウトしたいだけです:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="index.xsl"?>
<playToc>
    <play>a_and_c.xml</play>
    <play>all_well.xml</play>
    <play>as_you.xml</play>
    <play>com_err.xml</play>
    <play>coriolan.xml</play>
    <play>cymbelin.xml</play>
    <name>Title 1</name>
    <name>Title 2</name>
    <name>Title 3</name>
    <name>Title 4</name>
    <name>Title 5</name>
    <name>Title 6</name>
</playToc>

シンプルですね。そして、ここに私のXSLがあります:

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="playToc">
<html>
<body style="text-align:center;">

<xsl:apply-templates select="play"></xsl:apply-templates>

</body>
</html>
</xsl:template>

<xsl:template match="play">

<xsl:variable name="URL">
    <xsl:value-of select="."/> 
</xsl:variable>

<xsl:variable name="TITLE">
    <xsl:value-of select="../name"/> 
</xsl:variable>

<a href="{$URL}"><xsl:value-of select="$TITLE"/></a>
<br />
</xsl:template>

</xsl:stylesheet>

そして、これは出力です:

Title 1
Title 1
Title 1
Title 1
Title 1
Title 1

もちろん、これを出力にしたい場合:

Title 1
Title 2
Title 3
Title 4
Title 5
Title 6

どんな助けでもとても素晴らしいでしょう!本当にありがとう!

4

2 に答える 2

2

XML入力は構造化されていませんが、次のようにしてこれを回避できます

<xsl:template match="play">
  <xsl:variable name="pos" select="position()"/>
  <a href="{.}">
    <xsl:value-of select="../name[position() = $pos]"/>
  </a>
  <br/>
</xsl:template>

を他のテンプレートに保持していることを確認してください<xsl:apply-templates select="play"/>。そうしないと、 を使用したアプローチが機能しposition()ません。

于 2012-10-21T09:49:10.450 に答える
1
<xsl:variable name="TITLE">      
 <xsl:value-of select="../name"/>   
</xsl:variable>

あなたの問題はここにあります。

の文字列値は、初期コンテキスト (現在の) ノードの親の最初の../name子の文字列値です。 name

実際に必要なのは、現在の ( ) ノードnameの位置と同じ位置にある子の値を取得することです。play

この完全で短い変換:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="play">
   <xsl:variable name="vPos" select="position()"/>
     <a href="{.}">
      <xsl:value-of select="../name[$vPos]"/>
     </a><br />
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

提供されたソース XML ドキュメントに適用した場合:

<playToc>
    <play>a_and_c.xml</play>
    <play>all_well.xml</play>
    <play>as_you.xml</play>
    <play>com_err.xml</play>
    <play>coriolan.xml</play>
    <play>cymbelin.xml</play>
    <name>Title 1</name>
    <name>Title 2</name>
    <name>Title 3</name>
    <name>Title 4</name>
    <name>Title 5</name>
    <name>Title 6</name>
</playToc>

必要な正しい結果が生成されます

<a href="a_and_c.xml">Title 1</a>
<br/>
<a href="all_well.xml">Title 2</a>
<br/>
<a href="as_you.xml">Title 3</a>
<br/>
<a href="com_err.xml">Title 4</a>
<br/>
<a href="coriolan.xml">Title 5</a>
<br/>
<a href="cymbelin.xml">Title 6</a>
<br/>

注意してください:

  1. 使用する必要はまったくxsl:apply-templatesありません。

  2. テンプレートは 1 つだけです。

于 2012-10-21T13:56:22.687 に答える