我使用这个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>
我该怎么办呢。
答案 0 :(得分:1)
快速解决方案是将preceding-sibling::
更改为preceding::
。
或者,您可以使用xsl:number
或 - 如果您感兴趣的是获得唯一ID,不一定是连续的 - 请使用generate-id()
函数。
P.S。你的样式表非常复杂且不必要。例如,而不是:
<xsl:element name="ns:file">
你可以简单地写一下:
<ns:file>
您还应该学会使用attribute value template,并考虑递归地为所有元素类型重复使用单个模板。