0

次のような XML ファイルがあります。

<components>
       <comp>
      <ref>q7</ref>
      <partnumber>foo</partnumber>
   </comp>
   <comp>
      <ref>q1</ref>
      <partnumber>foo</partnumber>
   </comp>
   <comp>
      <ref>q6</ref>
      <partnumber>bar</partnumber>
   </comp>
   <comp>
      <ref>q3</ref>
      <partnumber>bar</partnumber>
   </comp>
</components>

出力ファイルが次のようになるように、部品番号でグループ化し、ref でソートする必要があります。

q1 q7, foo
q3 q6, bar

しかし、私はこの出力を得ています:

q3 q6, bar
q1 q7, foo

ここに私のXSLがあります:

<!DOCTYPE xsl:stylesheet [
  <!ENTITY nl  "&#xd;&#xa;">    <!--new line CR, LF, or LF, your choice -->
]>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text"/>
    <xsl:key name='compspec' match="comp" use="partnumber" />
    <xsl:template match="/components">
        <xsl:for-each select="comp[generate-id(.)=generate-id(key('compspec',partnumber)[1])]">
            <xsl:sort select="ref"/>
            <xsl:for-each select="key('compspec',partnumber)">
                <xsl:sort select="ref"/>
                <xsl:value-of select="ref"/>
                <xsl:text> </xsl:text>
            </xsl:for-each>
            <xsl:text>,</xsl:text>
            <xsl:value-of select="partnumber"/>
            <xsl:text>&nl;</xsl:text>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet> 

このシーケンスを取得する理由は理解していますが、XSLT についてはかなり初心者であり、修正方法がわかりません。コードで何を修正する必要がありますか? XSLT 1.0 を使用しています。ありがとうございました!

4

2 に答える 2

1

この行を削除するだけで、目的の出力が得られます。

 <xsl:sort select="partnumber"/>

(および) でアルファベット順に並べ替えているため、最初のfor-eachループで 。partnumberbarfoo

于 2015-03-08T23:16:54.057 に答える
0

comp/ref の最小値で部品番号が等しいグループをソートする必要があります

XSLT 1.0 でこれを行うには、次の 2 つのパスを作成する必要があります。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:key name='compspec' match="comp" use="partnumber" />

<xsl:template match="/components">
    <!-- first pass -->
    <xsl:variable name="groups">
        <xsl:for-each select="comp[generate-id(.)=generate-id(key('compspec',partnumber)[1])]">
            <group name="{partnumber}">
                <xsl:for-each select="key('compspec', partnumber)">
                    <xsl:sort select="ref"/>
                    <value>
                        <xsl:value-of select="ref"/>
                    </value>
                </xsl:for-each>
            </group>
        </xsl:for-each>
    </xsl:variable>
    <!-- output -->
    <xsl:for-each select="exsl:node-set($groups)/group">
        <xsl:sort select="value[1]"/>
        <xsl:for-each select="value">
            <xsl:value-of select="."/>
            <xsl:if test="position()!=last()">
                <xsl:text> </xsl:text>
            </xsl:if>
        </xsl:for-each>
        <xsl:text>, </xsl:text>
        <xsl:value-of select="@name"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet> 


あなたの例では、refテキスト値が含まれており、上記のコードではtext としてソートされています。したがって、comp/ref の最小値は、実際にはアルファベット順の最初のref値です。

于 2015-03-09T06:53:50.240 に答える