2

XML 文書を処理するための基本的な概念がいくつか欠けているに違いありません。ソース XML は次のとおりです。

<?xml version="1.0" encoding="ISO-8859-1"?>
<Root>
  <Element>visitorNameAlt</Element>
  <Element>visitorScore</Element>
  <Element>visitorTimeouts</Element>
  <Element>Blank</Element>
  <Element>homeNameAlt</Element>
  <Element>homeScore</Element>
  <Element>homeTimeouts</Element>
  <Element>Blank</Element>
  <Element>period</Element>
  <Element>optionalText</Element>
  <Element>flag</Element>
  <Element>Blank</Element>
  <Element>scoreLogo</Element>
  <Element>sponsorLogo</Element>
</Root>

そして、私の XSL スタイルシート:

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

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" indent="yes"/>

<xsl:template match="/">
    <xsl:for-each select="/Root">
        <xsl:value-of select="position()"/>
        <xsl:value-of select="Element"/>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

私が望むのは、ソース XML ドキュメントから "要素" の名前を抜き出し、それらの相対的な位置を前に出すことだけです。

私の出力は、最初の要素が続く「1」だけです。

私は XSLT を初めて使用しますが、for-each を使用して他のドキュメントを正常に処理しました。

前もって感謝します。

明細書

4

2 に答える 2

1

Elementタグではなく、Rootタグをループしています。これを試して:

<xsl:template match="/">
  <xsl:for-each select="/Root/Element">
     <xsl:value-of select="position()"/>
     <xsl:value-of select="."/>
  </xsl:for-each>
</xsl:template>

selectの2番目の値を「。」に変更する必要があることに注意してください。または「text()」。

于 2012-08-09T18:20:59.030 に答える
0

XSLT は命令型のプログラミング言語ではありません。XSLT プロセッサは各要素を順番に取得し、スタイルシートに一致させようとします。これを書く慣用的な方法は、for-each を使用しないことです。

<xsl:template match="/Root">
    <xsl:apply-templates select="Element"/>
</xsl:template>

<xsl:template match="Element">
    <xsl:value-of select="position()"/>
    <xsl:value-of select="."/>
</xsl:template>

最初のテンプレートはルートに一致し、スタイルシートをElement内のすべてのノードに適用するようプロセッサに指示しますRoot。2 番目のテンプレートはそれらのノードに一致し、必要な情報を出力します。

于 2012-08-09T18:24:18.517 に答える