所有节点的xsl唯一值键

时间:2014-10-09 13:40:40

标签: xml xslt xpath

我使用这个xsl文件从xml转换为rdf。并将该职位作为资源名称" rdf:about ="

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:ns="http://www.w3.org/2006/03/wn/wn20/schema/"
xml:lang="en-US">

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
<!-- file -->
    <xsl:for-each select="file">
          <xsl:element name="ns:file">
            <xsl:attribute name="rdf:about">
                <xsl:value-of select="@name"/>  
            </xsl:attribute>
<!-- paragraph -->
            <xsl:element name="ns:Paragraph">   
                <xsl:for-each select="paragraph">
                      <xsl:element name="ns:paragraph">
                        <xsl:attribute name="rdf:about">
                            <xsl:value-of select="count(preceding-sibling::*[name() = name(current())])"/>  
                        </xsl:attribute>
                    </xsl:element>
<!-- phrase -->
                <xsl:element name="ns:Phrase">  
                    <xsl:for-each select="phrase">
                             <xsl:element name="ns:phrase">
                            <xsl:attribute name="rdf:about">
                                <xsl:value-of select="count(preceding-sibling::*[name() = name(current())])"/>  
                            </xsl:attribute>
                        </xsl:element>
<!-- word -->
                    <xsl:element name="ns:Word">    
                        <xsl:for-each select="word">
                                <xsl:element name="ns:word">
                                <xsl:attribute name="rdf:about">
                                    <xsl:value-of select="count(preceding-sibling::*[name() = name(current())])"/>  
                                </xsl:attribute>
                            </xsl:element>
                        </xsl:for-each>
                    </xsl:element>
                </xsl:for-each>
            </xsl:element>
        </xsl:for-each>
    </xsl:element>
        </xsl:element>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

在此xml文件

<?xml version='1.0' encoding='ISO-8859-1'?>
<file>
  <paragraph>
    <phrase>
        <word>
    </phrase>
  </paragraph>
  <paragraph>
    <phrase>
        <word/>
        <word/>
    </phrase>
    <phrase>
        <word/>
    </phrase>
  </paragraph>
</file>

结果:

<?xml version="1.0" encoding="UTF-8"?>
<ns:file xmlns:ns="http://www.w3.org/2006/03/wn/wn20/schema/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" rdf:about="">
<ns:Paragraph>
<ns:paragraph rdf:about="0"/>
<ns:Phrase>
<ns:phrase rdf:about="0"/>
<ns:Word>
<ns:word rdf:about="0"/>
</ns:Word>
</ns:Phrase>
<ns:paragraph rdf:about="1"/>
<ns:Phrase>
<ns:phrase rdf:about="0"/>
<ns:Word>
<ns:word rdf:about="0"/>
<ns:word rdf:about="1"/>
</ns:Word>
<ns:phrase rdf:about="1"/>
<ns:Word>
<ns:word rdf:about="0"/>
</ns:Word>
</ns:Phrase>
</ns:Paragraph>
</ns:file>

我需要一个唯一的资源名称。对于每个资源,我得到了什么?

<?xml version="1.0" encoding="UTF-8"?>
<ns:file xmlns:ns="http://www.w3.org/2006/03/wn/wn20/schema/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" rdf:about="">
<ns:Paragraph>
<ns:paragraph rdf:about="0"/>
<ns:Phrase>
<ns:phrase rdf:about="0"/>
<ns:Word>
<ns:word rdf:about="0"/>
</ns:Word>
</ns:Phrase>
<ns:paragraph rdf:about="1"/>
<ns:Phrase>
<ns:phrase rdf:about="1"/>
<ns:Word>
<ns:word rdf:about="1"/>
<ns:word rdf:about="2"/>
</ns:Word>
<ns:phrase rdf:about="1"/>
<ns:Word>
<ns:word rdf:about="3"/>
</ns:Word>
</ns:Phrase>
</ns:Paragraph>
</ns:file>

我该怎么办呢。

1 个答案:

答案 0 :(得分:1)

快速解决方案是将preceding-sibling::更改为preceding::

或者,您可以使用xsl:number或 - 如果您感兴趣的是获得唯一ID,不一定是连续的 - 请使用generate-id()函数。


P.S。你的样式表非常复杂且不必要。例如,而不是:

<xsl:element name="ns:file">

你可以简单地写一下:

<ns:file>

您还应该学会使用attribute value template,并考虑递归地为所有元素类型重复使用单个模板。