3

次のような値を持つ XML 要素があります。

<?xml version='1.0' encoding='UTF-8'?>
<Report_Data>
   <Report_Entry>
     <Address>1234 Address Line 1&amp;#xa;Pleasanton, CA 94588&amp;#xa;United States of America</Address>
</Report_Entry>
<Report_Entry>
     <Address>1234 Address Line 1&amp;#xa;5678 Address Line 2&amp;#xa;Pleasanton, CA 94588&amp;#xa;United States of America</Address>
</Report_Entry>
</Report_Data>   

次の値の出現回数を数えようとしています。

<xsl:variable name="String1" select="'&amp;#xa;'"/>

私が出力したいのは、最初のレコードに 2、2 番目のレコードに 3 という新しい変数を作成することです。

For-Each Report_Entry ループから実行していることに注意してください。

4

2 に答える 2

1

あなたが探しているテンプレートはGetNoOfOccurance です

<xsl:template name="GetNoOfOccurance">
    <xsl:param name="String"/>
    <xsl:param name="SubString"/>
    <xsl:param name="Counter" select="0"/>
    <xsl:variable name="sa" select="substring-after($String, $SubString)"/>
    <xsl:choose>
        <xsl:when test="$sa != '' or contains($String, $SubString)">
            <xsl:call-template name="GetNoOfOccurance">
                <xsl:with-param name="String" select="$sa"/>
                <xsl:with-param name="SubString" select="$SubString"/>
                <xsl:with-param name="Counter" select="$Counter + 1"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$Counter"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

上記の方法でテンプレートを呼び出します:-

<xsl:variable name="searchStr" select="'&amp;#xa;'"/>
<xsl:call-template name="GetNoOfOccurance">
    <xsl:with-param name="String" select="text()"/>
    <xsl:with-param name="SubString" select="$searchStr"/>
</xsl:call-template>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <xsl:variable name="searchStr" select="'&amp;#xa;'"/>
        <xsl:for-each select="//Address">
            <xsl:call-template name="GetNoOfOccurance">
                <xsl:with-param name="String" select="text()"/>
                <xsl:with-param name="SubString" select="$searchStr"/>
            </xsl:call-template>
        </xsl:for-each>
    </xsl:template>

    <xsl:template name="GetNoOfOccurance">
        <xsl:param name="String"/>
        <xsl:param name="SubString"/>
        <xsl:param name="Counter" select="0"/>
        <xsl:variable name="sa" select="substring-after($String, $SubString)"/>
        <xsl:choose>
            <xsl:when test="$sa != '' or contains($String, $SubString)">
                <xsl:call-template name="GetNoOfOccurance">
                    <xsl:with-param name="String" select="$sa"/>
                    <xsl:with-param name="SubString" select="$SubString"/>
                    <xsl:with-param name="Counter" select="$Counter + 1"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$Counter"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

テンプレートGetNoOfOccuranceは @Tomalak回答から取得されます

于 2012-10-13T00:06:34.233 に答える
1

XSLT バージョンについて言及するのを忘れていました。

XSLT 2.0 を使用している場合、最も簡単な方法は、tokenize() 関数を使用して 1 を減算することです。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="text"/>

<xsl:variable name="String1" select="'&amp;#xa;'"/>
<xsl:template match="/*">
  <xsl:for-each select="Report_Entry/Address">There are <xsl:value-of select="count(tokenize(concat(' ',.,' '),$String1)) - 1" /> occurrences.
</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

...これにより、サンプル入力に対してこの出力が得られます...

There are 2 occurrences.
There are 3 occurrences.
于 2012-10-15T14:13:58.253 に答える