我工作的XSLT,在这里我需要实现的东西如下。 我的源XML样本是这样的。
<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
<cd>
<title>A</title>
<title>B</title>
<title>C</title>
</cd>
</catalog>
考虑有一定的键值对列表那里。
Key Value
A Algebra
B Biology
C Chemistry
D Data Analysis
--- ---
---- ---
我需要编写一个XSLT使得对键“A”的每一次出现,都需要适当的值来代替。
我还需要提及的相同XSLT键值对的列表。 示例输出:
<Data>
<Subject>Algebra</Subject>
<Subject>Biology</Subject>
<Subject>Chemistry</Subject>
</Data>
任何一个可以帮助我如何做到这一点。
谢谢。
一,简单的XSLT 1.0解决方案
这一转变 :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<my:codes>
<code key="A" value="Algebra"/>
<code key="B" value="Biology"/>
<code key="C" value="Chemistry"/>
<code key="D" value="Data Analysis"/>
</my:codes>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"title/text()[. = document('')/*/my:codes/*/@key]">
<xsl:value-of select=
"document('')/*/my:codes/*[@key=current()]/@value"/>
</xsl:template>
</xsl:stylesheet>
当施加在提供的XML文档:
<catalog>
<cd>
<title>A</title>
<title>B</title>
<title>C</title>
</cd>
</catalog>
产生想要的,正确的结果 :
<catalog>
<cd>
<title>Algebra</title>
<title>Biology</title>
<title>Chemistry</title>
</cd>
</catalog>
说明 :
这是包括作为一个全球性的元素(子元素嵌入XML节点的标准方式xsl:stylesheet
)属于一个(非空)的命名空间,比XSL命名空间不同。
II。 更有效的XSLT 1.0解决方案,使用的键 :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<my:codes>
<code key="A" value="Algebra"/>
<code key="B" value="Biology"/>
<code key="C" value="Chemistry"/>
<code key="D" value="Data Analysis"/>
</my:codes>
<xsl:key name="kCodeByName" match="code" use="@key"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"title/text()[. = document('')/*/my:codes/*/@key]">
<xsl:variable name="vCur" select="."/>
<xsl:for-each select="document('')">
<xsl:value-of select=
"key('kCodeByName', $vCur)/@value"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
当在相同的XML文档(上图)中,相同的正确应用该转化,希望产生结果 :
<catalog>
<cd>
<title value="Algebra"/>
<title value="Biology"/>
<title value="Chemistry"/>
</cd>
</catalog>
说明 :
通过访问数据key()
函数是通常的子线性-通常O(1),是非常快于线性搜索(这是重要的,如果要搜索的节点的数目是大的)。
通过索引访问一个文件的一个节点( xsl:key
),而处理的另一文档的节点是可能的,如果待查找的是当前文档包含该节点的文件。 为了从其他文件访问的节点,它的根(或感兴趣的节点需要被保存和参考关的变量。)
III。 XSLT 2.0溶液 :
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vCodes">
<codes>
<code key="A" value="Algebra"/>
<code key="B" value="Biology"/>
<code key="C" value="Chemistry"/>
<code key="D" value="Data Analysis"/>
</codes>
</xsl:variable>
<xsl:key name="kCodeByName" match="code" use="string(@key)"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"title/text()[key('kCodeByName', ., $vCodes)]">
<xsl:sequence select=
"key('kCodeByName', ., $vCodes)/@value"/>
</xsl:template>
</xsl:stylesheet>
当在相同的XML文档(上图)中,相同的正确应用该转化,希望产生结果 :
<catalog>
<cd>
<title value="Algebra"/>
<title value="Biology"/>
<title value="Chemistry"/>
</cd>
</catalog>
说明 :
几乎一样有效XSLT 1.0解决方案,但:
在XSLT 2.0的模板匹配模式可以包含一个可变参考。
在XSLT 2.0没有必要杂技表演操纵电流和索引文件-的的第三个参数key()
函数是指定其索引使用树。