4
<page>
  <tab dim="70"></tab>
  <tab dim="40"></tab>
  <tab dim="30"></tab>
  <tab dim="30"></tab>
  <tab dim="30"></tab>
  <tab dim="70"></tab>
</page>

タブのdim属性の値を取得し、xslt.meansを使用して個別の値を取り出す方法は、30,40,70を出力することを意味します

4

2 に答える 2

3

個別の属性値を選択するには、次の XPath を使用できます。

/page/tab[not(@dim=preceding-sibling::tab/@dim)]/@dim

可能な XSLT テンプレートは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:template match="/">
        <xsl:for-each select="/page/tab[not(@dim=preceding-sibling::tab/@dim)]/@dim">
            <xsl:sort select="." data-type="number"/>
            <xsl:value-of select="concat(., substring(',', 2 - (position() != last())))"/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

ソース ドキュメントをPHP のスタイルシートで変換するには、次を使用できます。

$xml = new DOMDocument;
$xml->load('collection.xml');
$xsl = new DOMDocument;
$xsl->load('collection.xsl');
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
echo $proc->transformToXML($xml);

これにより、出力で 30,40,70 が得られます。

次のようにするだけで、XSLT を使用せずに同じことを実現できます。

$page = simplexml_load_file('NewFile.xml');
$dims = $page->xpath('/page/tab[not(@dim=preceding-sibling::tab/@dim)]/@dim');
$dims = array_map('strval', $dims);
sort($dims);
echo implode(',', $dims);

こちらもご覧ください

于 2012-08-28T08:49:39.557 に答える
1

使用するグループ化preceding-sibling::someNameは非常に遅く (O(N^2) -- 2 次)、大規模なノード セットで使用するには法外な場合があります。

シンプルで最も効率的なMuenchian グループ化ソリューションを次に示します。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:key name="kTabByDim" match="tab" use="@dim"/>

 <xsl:template match="/*">
  <xsl:apply-templates select=
   "tab[generate-id()=generate-id(key('kTabByDim',@dim)[1])]">
    <xsl:sort select="@dim" data-type="number"/>
  </xsl:apply-templates>
 </xsl:template>
 <xsl:template match="tab">
   <xsl:if test="position() >1">,</xsl:if>
   <xsl:value-of select="@dim"/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<page>
  <tab dim="70"></tab>
  <tab dim="40"></tab>
  <tab dim="30"></tab>
  <tab dim="30"></tab>
  <tab dim="30"></tab>
  <tab dim="70"></tab>
</page>

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

30,40,70
于 2012-08-28T11:46:32.217 に答える