2

私はxmlのソース抜粋を持っています:

        <TableRow TableRowLevel="1" RowTitle="" TableRowNumber="2" class="OddLegacy">
            <TableCell>
                <Paragraph>10.140.50.50</Paragraph></TableCell>
            <TableCell>
                <Paragraph>Sun Solaris 8</Paragraph></TableCell>
            <TableCell>
                <Paragraph>53.1</Paragraph></TableCell>
            <TableCell>
                <UnorderedList UnorderedListLevel="1" class="compactList" UnorderedListNumber="1">
                    <ListItem>opusone.dal.veritas.com</ListItem>
                    <ListItem>OPUSONE</ListItem></UnorderedList></TableCell></TableRow>
        <TableRow TableRowLevel="1" RowTitle="" TableRowNumber="3" class="Even">
            <TableCell>
                <Paragraph>10.140.50.163</Paragraph></TableCell>
            <TableCell>
                <Paragraph>Sun Solaris 8</Paragraph></TableCell>
            <TableCell>
                <Paragraph>53.0</Paragraph></TableCell>
            <TableCell>
                <UnorderedList UnorderedListLevel="1" class="compactList" UnorderedListNumber="1">
                    <ListItem>dns1.dal.veritas.com</ListItem>
                    <ListItem>opusone.dal.veritas.com</ListItem></UnorderedList></TableCell></TableRow>
        <TableRow TableRowLevel="1" RowTitle="" TableRowNumber="4" class="OddLegacy">
            <TableCell>
                <Paragraph>10.140.50.82</Paragraph></TableCell>
            <TableCell>
                <Paragraph>HP-UX 870849686</Paragraph></TableCell>
            <TableCell>
                <Paragraph>31.4</Paragraph></TableCell>
            <TableCell>
                <UnorderedList UnorderedListLevel="1" class="compactList" UnorderedListNumber="1">
                    <ListItem>unknown</ListItem>
                    <ListItem>testarossa.dal.veritas.com</ListItem></UnorderedList></TableCell></TableRow>
        <TableRow TableRowLevel="1" RowTitle="" TableRowNumber="5" class="Even">
            <TableCell>
                <Paragraph>10.140.50.71</Paragraph></TableCell>
            <TableCell>
                <Paragraph>Microsoft Windows Server 2008 R2, Enterprise Edition</Paragraph></TableCell>
            <TableCell>
                <Paragraph>30.5</Paragraph></TableCell>
            <TableCell>
                <UnorderedList UnorderedListLevel="1" class="compactList" UnorderedListNumber="1">
                    <ListItem>EVSERV1.evexample.local</ListItem>
                    <ListItem>EVSERV1</ListItem></UnorderedList></TableCell></TableRow>

OS (Microsoft Windows Server 2008 R2、Enterprise Edition) が一意の場合、ソースの行ごとにテーブル行を出力する必要があります。これまでのところ、私は持っています:

                <xsl:for-each select="Table/TableRow[TableCell[2]/Paragraph[not(preceding-sibling::TableCell[2]/Paragraph)]]">

                    <xsl:sort select="TableCell[2]/Paragraph"/>
                        <xsl:variable name="newosname" select="TableCell[2]/Paragraph"/>
                        <xsl:variable name="oscount" select="count(parent::Table/TableRow[TableCell/Paragraph = $newosname])"/>
                        <tr>
                            <td>
                                <xsl:value-of select="$newosname"/>
                                <xsl:value-of select ="TableCell[2]/Paragraph[not(preceding::TableCell[2]/Paragraph)]"/>
                            </td>
                            <td>
                                <xsl:value-of select="$oscount"/>
                            </td>
                        </tr>
                </xsl:for-each>

前のテストではなく、軸をテストしようとして遊んでいるだけであることに注意してください。

期待される出力

<tr>
<td>Sun Solaris 8</td>
<td>2</td>
</tr>
<tr>
<td>HP-UX 870849686</td>
<td>1</td>
</tr>
....
4

2 に答える 2

0

次のテンプレート:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
    <xsl:output indent="yes"/>
    <xsl:template match="/">
        <xsl:variable name="oss" as="xs:string+">
            <xsl:sequence select="distinct-values( Table/TableRow/TableCell[2]/Paragraph/text() )"/>
        </xsl:variable>
        <xsl:variable name="table" select="Table/TableRow"/>
        <xsl:for-each select="$oss">
            <xsl:sort select="."/>
            <tr>
                <td>
                    <xsl:value-of select="."/>
                </td>
                <td>
                    <xsl:value-of select="count($table[TableCell[2]/Paragraph/text() = current()])"/>
                </td>
            </tr>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

提供された入力 XML に適用すると、次の出力が得られます。

<?xml version="1.0" encoding="UTF-8"?>
<tr>
    <td>HP-UX 870849686</td>
    <td>1</td>
</tr>
<tr>
    <td>Microsoft Windows Server 2008 R2, Enterprise Edition</td>
    <td>1</td>
</tr>
<tr>
    <td>Sun Solaris 8</td>
    <td>2</td>
</tr>
于 2012-06-01T01:08:14.413 に答える
0

この XSLT 1.0 変換:

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

 <xsl:key name="kRowByOs" match="TableRow"
  use="TableCell[2]/Paragraph"/>

 <xsl:template match=
  "TableRow
     [generate-id()
     =
      generate-id(key('kRowByOs', TableCell[2]/Paragraph)[1])
     ]">
  <tr>
   <td><xsl:value-of select="TableCell[2]/Paragraph"/></td>
   <td><xsl:value-of select=
    "count(key('kRowByOs', TableCell[2]/Paragraph))"/></td>
  </tr>
  </xsl:template>

  <xsl:template match="text()"/>
</xsl:stylesheet>

次の XML ドキュメント(単一の最上位要素にラップされた提供されたフラグメント) に適用された場合:

<t>
            <TableRow TableRowLevel="1" RowTitle="" TableRowNumber="2" class="OddLegacy">
                <TableCell>
                    <Paragraph>10.140.50.50</Paragraph></TableCell>
                <TableCell>
                    <Paragraph>Sun Solaris 8</Paragraph></TableCell>
                <TableCell>
                    <Paragraph>53.1</Paragraph></TableCell>
                <TableCell>
                    <UnorderedList UnorderedListLevel="1" class="compactList" UnorderedListNumber="1">
                        <ListItem>opusone.dal.veritas.com</ListItem>
                        <ListItem>OPUSONE</ListItem></UnorderedList></TableCell></TableRow>
            <TableRow TableRowLevel="1" RowTitle="" TableRowNumber="3" class="Even">
                <TableCell>
                    <Paragraph>10.140.50.163</Paragraph></TableCell>
                <TableCell>
                    <Paragraph>Sun Solaris 8</Paragraph></TableCell>
                <TableCell>
                    <Paragraph>53.0</Paragraph></TableCell>
                <TableCell>
                    <UnorderedList UnorderedListLevel="1" class="compactList" UnorderedListNumber="1">
                        <ListItem>dns1.dal.veritas.com</ListItem>
                        <ListItem>opusone.dal.veritas.com</ListItem></UnorderedList></TableCell></TableRow>
            <TableRow TableRowLevel="1" RowTitle="" TableRowNumber="4" class="OddLegacy">
                <TableCell>
                    <Paragraph>10.140.50.82</Paragraph></TableCell>
                <TableCell>
                    <Paragraph>HP-UX 870849686</Paragraph></TableCell>
                <TableCell>
                    <Paragraph>31.4</Paragraph></TableCell>
                <TableCell>
                    <UnorderedList UnorderedListLevel="1" class="compactList" UnorderedListNumber="1">
                        <ListItem>unknown</ListItem>
                        <ListItem>testarossa.dal.veritas.com</ListItem></UnorderedList></TableCell></TableRow>
            <TableRow TableRowLevel="1" RowTitle="" TableRowNumber="5" class="Even">
                <TableCell>
                    <Paragraph>10.140.50.71</Paragraph></TableCell>
                <TableCell>
                    <Paragraph>Microsoft Windows Server 2008 R2, Enterprise Edition</Paragraph></TableCell>
                <TableCell>
                    <Paragraph>30.5</Paragraph></TableCell>
                <TableCell>
                    <UnorderedList UnorderedListLevel="1" class="compactList" UnorderedListNumber="1">
                        <ListItem>EVSERV1.evexample.local</ListItem>
                        <ListItem>EVSERV1</ListItem></UnorderedList></TableCell></TableRow>
</t>

必要な正しい結果が生成されます。

<tr>
   <td>Sun Solaris 8</td>
   <td>2</td>
</tr>
<tr>
   <td>HP-UX 870849686</td>
   <td>1</td>
</tr>
<tr>
   <td>Microsoft Windows Server 2008 R2, Enterprise Edition</td>
   <td>1</td>
</tr>

説明:

グループ化のための Muenchian メソッドの適切な使用。

于 2012-06-01T03:33:26.183 に答える