0

これを行うための巧妙で簡潔な方法があるに違いありません。

<xsl:call-template name="item">
  <xsl:with-param name="name" ><xsl:value-of select="name()" /></xsl:with-param>
  <xsl:with-param name="value"><xsl:value-of select="."      /></xsl:with-param>
</xsl:call-template>

xsl:value-of select="."通常はすべて順調です。しかし、時々、現在のノードに子があり、休憩が必要なときにテキストがすべて一緒に実行されることがあります。

The Right Stuff<line/>Tom Wolfe

また

<title>The Right Stuff</title><author>Tom Wolfe</author>

このような場合は、"Stuff" と "Tom" の間にスペースかドットか何かを入れてください。

どのように言うことができますxsl:value-of select="." but add a space instead of running node contents togetherか?

4

3 に答える 3

4

まず、これを決して書かないでください:

<xsl:with-param name="name" ><xsl:value-of select="name()" /></xsl:with-param>

これを書くことができたとき:

<xsl:with-param name="name" select="name()" />

冗長であるだけでなく、単純な文字列のみが必要な場合にメモリ内に一時ツリーを構築するのは非常に非効率的です。悲しいことに、この間違いはますます一般的になっているようです。

xsl:value-of は、要素を指定すると、テキスト ノードの連結である要素の文字列値を抽出します。これは、混合コンテンツに一般的で使い慣れたマークアップ デザインを使用している場合に便利です。すべてのタグを削除すると、人間が判読できるコンテンツが残ります。XML がこの規則を使用するように設計されていない場合、文字列値に対するこの規則はあまり役に立ちません (これが、スキーマ認識 XPath では、要素の文字列値を取得することが許可されていないのはそのためです)。単純な内容または混合内容で定義されます)。

あなたの場合、要素ノードを文字列値ではなくパラメーターとして渡し、呼び出されたテンプレートで apply-templates を使用して要素ノードのコンテンツを処理することをお勧めします。

于 2012-07-03T07:47:31.430 に答える
0

使用する<xsl:value-of select="."/>と、コンテキストノードの値とすべての子ノードが配置されます。単に「。」を追加することはできないと思います。またはテキスト値間の「スペース」。

ただし、そのような子ノードを反復処理して、「。」を追加する機会を得るような方法で実装できます。または「スペース」。

XML が次のようになっているとします。

<?xml version="1.0" encoding="UTF-8"?>
<root>
     <item>
        <title>The Right Stuff</title><author>Tom Wolfe</author>
     </item>
</root>

次に、次の XSL を使用して "." を配置できます。子ノードの値の後。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes" method="xml" />
    <xsl:template match="/">
        <xsl:call-template name="Item">
            <xsl:with-param name="name" select="name()"/>
            <xsl:with-param name="value" select="//item[1]"/>
        </xsl:call-template>
    </xsl:template>

    <xsl:template name="Item">
        <xsl:param name="name" />
        <xsl:param name="value" />
        <xsl:for-each select="$value/*">
            <xsl:value-of select="."/>.
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

これが役立つことを願っています。

于 2012-07-03T04:28:34.720 に答える