2

私はstackoverflowに不慣れであり、助けていただければ幸いです。これは私が遭遇したXSLT1.0の問題であり、私が見つけられない簡単な解決策があると確信しています。

bookそれぞれにタイトルが付いている多くの章を含むトップ要素があります。

<?xml version="1.0" encoding="utf-8"?>
<Book>
  <Chapter>
    <Title>ONE</Title>
  </Chapter>
  <Chapter>
    <Title>TWO</Title>
  </Chapter>
  <Chapter>
    <Title></Title>
  </Chapter>
  <Chapter>
    <Title>FOUR</Title>
  </Chapter>
</Book>

上記をCSV-Title-Listという1つの要素に変換したいと思います。タイトルが空の場合が発生するまでは、簡単に思えました。次のスタイルシートを使用すると、予期しないカンマが表示されます。

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

    <xsl:template match="Book">
      <CSV-Title-List>
      <xsl:for-each select="Chapter/Title">
        <xsl:value-of select="."/>
        <xsl:if test="position() &lt; last()">
          <xsl:text>, </xsl:text>
        </xsl:if>
      </xsl:for-each>
      </CSV-Title-List>
    </xsl:template>   
</xsl:stylesheet>

私の質問は、上記のスタイルシートでコンマを出力する前に、次のチャプター/タイトルでnull文字列をきれいにチェックするにはどうすればよいですか。より良い方法があるに違いありませんか?任意の提案をいただければ幸いです。アドバイスに感謝します。

4

2 に答える 2

1

この変換:

<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="/*">
  <xsl:apply-templates select="Chapter[normalize-space(Title)]"/>
 </xsl:template>

 <xsl:template match="Chapter">
  <xsl:if test="not(position()=1)">,</xsl:if>
  <xsl:value-of select="Title"/>
 </xsl:template>
</xsl:stylesheet>

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

<Book>
  <Chapter>
    <Title>ONE</Title>
  </Chapter>
  <Chapter>
    <Title>TWO</Title>
  </Chapter>
  <Chapter>
    <Title></Title>
  </Chapter>
  <Chapter>
    <Title>FOUR</Title>
  </Chapter>
</Book>

必要な正しい結果を生成します。

ONE,TWO,FOUR

同じ変換が別のXMLドキュメントに適用された場合-最初のドキュメントには/*/Chapter/Title空白のみの文字列値があります

<Book>
  <Chapter>
    <Title>     </Title>
  </Chapter>
  <Chapter>
    <Title>TWO</Title>
  </Chapter>
  <Chapter>
    <Title></Title>
  </Chapter>
  <Chapter>
    <Title>FOUR</Title>
  </Chapter>
</Book>

ここでも、正しい、必要な結果が生成されます。

TWO,FOUR
于 2012-09-01T18:26:38.233 に答える
0

これは、最初のTitle要素が空白の場合でも機能するソリューションです。

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

 <xsl:template match="Book">
  <xsl:variable name="booklist">
   <xsl:apply-templates />
  </xsl:variable>
  <xsl:value-of select="substring($booklist,2)" />
 </xsl:template>

 <xsl:template match="Title/text()">
  <xsl:text>,</xsl:text>
  <xsl:copy />
 </xsl:template>
</xsl:stylesheet>

また、明示的な条件を使用せず、すべての値の前にコンマを追加し、結果を変数に格納し、その変数を2番目の文字以降に出力します(最初のコンマをスキップします)。

于 2012-09-01T19:40:17.040 に答える