2012-08-28 74 views
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> 

如何获取标签的暗属性的值,并使用xslt.means拿出不同的值打印不同的值,它会打印30,40,70采取属性节点,并使用XSLT

回答

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> 

transform the source document with the stylesheet in 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); 

另见

+0

你可以参考任何资源。这样我可以看得更远? – varuog

1

使用preceding-sibling::someName进行分组的速度非常慢(O(N^2) - 二次方),并且可能无法在大型节点集上使用。

下面是一个简单和最有效的Muenchian grouping解决方案

<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