2017-02-01 3 views
1

へ/ XPathの-2.0XSLT-2.0:SaxonHE 9.7を使用して、現在のグループからの組み合わせの結果()1

マイXML:

<osm> 
    <node> 
    <tag k="fhrs:id" v="204258"/> 
    <tag k="name" v="King of Wessex"/> 
    </node> 
    <node> 
    <tag k="fhrs:id" v="139245"/> 
    <tag k="name" v="The Royal Oak"/> 
    </node> 
    <node> 
    <tag k="fhrs:id" v="204258"/> 
    <tag k="name" v="The Rising Sun"/> 
    </node> 
    etc... 
</osm> 

私はfhrs:idのすべての重複値(v=)を返しますよ

<xsl:template match="/">  
    <xsl:for-each-group select="/*/*/tag[@k='fhrs:id']" group-by="@v"> 
     <xsl:apply-templates select="current-group() [current-group()[2]]"/> 
    </xsl:for-each-group> 
</xsl:template> 

出力をgeojson形式に変換しています。これには、最後の要素を除くすべての要素がカンマで終わる必要があります。他のルーチンでは、私はそれが最後であるかどうかをテストするためにこれを使用しました:

<xsl:template match="/*/*/tag"> 
    { 

    ...<snip>... 

    }<xsl:if test="position() &lt; last()">,</xsl:if> 
</xsl:template> 

しかし、この場合にはxsl:apply-templatesは一度に2を渡しているので、他のすべての要素がにGeoJSON出力にカンマが含まれていません。

xsl:for-each-groupのすべての出力を1つにまとめてからxsl:apply-templatesに渡す方法がありますか、最終的な要素を見つける別の方法ですか? xsl:for-each-groupでもそれについての最良の方法はありますか?

私は変数/配列を使用するさまざまな方法を検討しましたが、請求書に適合しないようです。

答えて

2

あなたはlast()に問題については

<xsl:template match="/"> 
    <xsl:variable name="duplicates" as="element()*">  
    <xsl:for-each-group select="/*/*/tag[@k='fhrs:id']" group-by="@v"> 
     <xsl:sequence select="current-group() [current-group()[2]]"/> 
    </xsl:for-each-group> 
    </xsl:variable> 
    <xsl:apply-templates select="$duplicates"/> 
</xsl:template> 

<xsl:template match="/">  
    <xsl:for-each-group select="/*/*/tag[@k='fhrs:id']" group-by="@v"> 
     <xsl:apply-templates select="current-group() [current-group()[2]]"/> 
    </xsl:for-each-group> 
</xsl:template> 

を変更することができ、Saxonicaはhttps://saxonica.plan.io/issues/3122で報告された問題を再現しており、私はあなたのケースでは、あなたが使用してlast()の使用を避けることができると思います少し異なるチェックposition() gt 1が、コンテンツを出力する前に:

<xsl:template match="/*/*/tag"> 
    <xsl:if test="position() gt 1">,</xsl:if> 
    { 

    "value" : "<xsl:value-of select="@v"/>" 

    } 
</xsl:template> 

<xsl:template match="/"> 
    <xsl:variable name="duplicates" as="element()*">  
     <xsl:for-each-group select="/*/*/tag[@k='fhrs:id']" group-by="@v"> 
      <xsl:sequence select="current-group() [current-group()[2]]"/> 
     </xsl:for-each-group> 
    </xsl:variable> 
    <xsl:apply-templates select="$duplicates"/> 
</xsl:template> 

このようにして、last()に関連するバグを避けることができるはずですが、シーケンスの項目間にコンマ出力が必要です。

+0

私は以前これを試していましたが、 "1つ以上の項目のシーケンスが変数$ duplicates(、...)の値として許可されていません" – DaveF

+0

@DaveF、申し訳ありません、タイプはシーケンスの 'element()*' –

+0

last()が重複したものだけでなく** all ** fhrs:idの値の合計を返すことを除いて、うまくいきました。そこで、私は 'duplicates'変数を適用されたテンプレートに渡しました: ' \t \t \t \t \t ' ので、それを使用: '} <のxsl:テスト= "位置()<数($複製)">、は '最高wqayにある場合? – DaveF

関連する問題