2017-05-07 13 views
0

以下の入力にはXSLを書く必要があります。xml - 期待される出力には、属性(キー)の値が最大のクラスター要素が必要です。XSLT - リスト内の他の要素よりも最大の属性値を持つ要素をコピーする

入力:

<ProductList> 
<Product ProductId="123"> 
<ClusterList> 
<Cluster Key="1" Price="100.00"/> 
<Cluster Key="3" Price="200.00"/> 
<Cluster Key="2" Price="300.00"/> 
</ClusterList> 
</Product> 
<Product ProductId="456"> 
<ClusterList> 
<Cluster Key="11" Price="100.00"/> 
<Cluster Key="33" Price="200.00"/> 
<Cluster Key="22" Price="300.00"/> 
</ClusterList> 
</Product> 
<ProductList> 

予想される出力:

<ProductList> 
<Product ProductId="123"> 
<ClusterList> 
<Cluster Key="3" Price="200.00"/> 
</ClusterList> 
</Product> 
<Product ProductId="456"> 
<ClusterList> 
<Cluster Key="33" Price="200.00"/> 
</ClusterList> 
</Product> 
<ProductList> 

そして、ここで私が書かれているXSLがあるが、:(

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

<xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/ClusterList/Cluster"> 
     <xsl:variable name="Max"> 
     <xsl:value-of select="/ClusterList/Cluster[not(preceding-sibling::Cluster/@Key &gt;= @Key) and not(following-sibling::Cluster/@Key &gt; @Key)]/@Key" /> 
     </xsl:variable> 

     <xsl:if test="@Key=$Max"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*" /> 
     </xsl:copy> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 
+0

** 1。**どのXSLTプロセッサを使用していますか? ** 2。**ネクタイの場合の結果はどうでしょうか? –

答えて

1

を働いていない私はあなたが試すことをお勧めそれはこうです:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="ClusterList"> 
    <xsl:copy> 
     <xsl:for-each select="Cluster"> 
      <xsl:sort select="@Key" data-type="number" order="descending"/> 
      <xsl:if test="position()=1"> 
       <xsl:copy-of select="."/> 
      </xsl:if> 
     </xsl:for-each> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

は、これはあなたがEXSLT math:max()またはmath:highest()拡張機能をサポートしていないXSLT 1.0プロセッサを使用していると仮定しています。

タイの場合、最初の結果のみが返されることに注意してください。


それをあなたが開始されている方法を行うには、あなたが持っている必要があります:

<xsl:template match="Cluster"> 
    <xsl:if test="not(preceding-sibling::Cluster/@Key &gt; current()/@Key) and not(following-sibling::Cluster/@Key &gt; current()/@Key)"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*" /> 
     </xsl:copy> 
    </xsl:if> 
</xsl:template> 

それは新たにそのすべての兄弟にすべてのClusterを比較するために持っているとして、非常に非効率的です。

+0

ありがとうマイケル!あなたは私の日を救った:) –

関連する問題