XSL转换,选择命名空间

时间:2013-12-23 13:22:59

标签: xslt namespaces transform

我是XSL的新手,但没关系,但这是我第一次需要对命名空间做些什么,而且我完全没有了,有人可以解释一下如何做到这一点: 我有一个像这样的XHTML:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<?xml-stylesheet type="text/xsl" href="5C.xslt"?> 
<!DOCTYPE rdf:RDF SYSTEM "http://purl.org/dc/schemas/dcmes-xml20000714.
dtd">

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:dcterms="http://purl.org/dc/terms/">


<rdf:Description rdf:about="MyJPeg.jpg">
<dc:title>Find Info</dc:title>
<dc:contributor>Myself</dc:contributor>
<dcterms:created>2013-12-11</dcterms:created> 
<dcterms:issued>2013-12-23</dcterms:issued>
</rdf:Description>
</rdf:RDF> 

我需要验证发布日期是否=到2013-10-10(回答否)

我的XSLT是:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xhtml="http://www.w3.org/1999/xhtml">
<xsl:output method="html" version="1.0" encoding="ISO-8859-1" indent="yes"/>

<xsl:template match="*">
<html><body><pre>
<xsl:value-of select="rdf/issued"/>
<xsl:if test="xxx = '2013-10-10' ">
</xsl:if>

</pre></body>
</html>
</xsl:template>
</xsl:stylesheet>

所以我试着对这一行有所了解:

<xsl:value-of select="rdf/issued"/>

(看看我是否得到了它) 并用这个验证:

<xsl:if test="xxx = '2013-10-10' ">

但我是新的名字空间,我无法找到如何获得我的价值, 有人能帮助我吗?

感谢

问题#2,解决方案有效,但是:  如果我想验证日期是否高于而不是相等,我该怎么做? (我替换= by&gt;),并且我将日期更改为更高和更低,并且每次都不起作用

<xsl:if test="rdf:Description/dcterms:issued &gt; '2001-01-01' ">
Good job
</xsl:if>

怎么了?

感谢

1 个答案:

答案 0 :(得分:3)

在XML中,具有命名空间的元素(如果与没有命名空间的元素不同)。例如,尽管具有相同的“本地”名称“RDF”,但以下两个元素是不同的。

<RDF>Test</RDF>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">Test</RDF>

要在XSLT中访问命名空间内的元素,首先必须在XSTL中声明相关的命名空间

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dcterms="http://purl.org/dc/terms/">

然后,如果你有一个引用元素的xpath表达式,你需要添加前缀

<xsl:value-of select="rdf:Description/dcterms:issued"/>

(我在你的问题中将其作为拼写错误,但“已发布”是XML示例中“描述”的子项!)。

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dcterms="http://purl.org/dc/terms/">
<xsl:output method="html" version="1.0" encoding="ISO-8859-1" indent="yes"/>

<xsl:template match="rdf:RDF">
<html><body><pre>
<xsl:value-of select="rdf:Description/dcterms:issued"/>
<xsl:if test="rdf:Description/dcterms:issued = '2013-10-10' ">
</xsl:if>

</pre></body>
</html>
</xsl:template>
</xsl:stylesheet>

值得一提的是,名称空间前缀(在本例中为“rdf:”)在XML中不必与在XSLT中相同。必须匹配的名称空间URI(“http://www.w3.org/1999/02/22-rdf-syntax-ns#”)。