在XSLT实现关键价值观(Implementing Key Value Concept in XSL

2019-06-25 13:14发布

我工作的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>

任何一个可以帮助我如何做到这一点。

谢谢。

Answer 1:

一,简单的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解决方案,但:

  1. 在XSLT 2.0的模板匹配模式可以包含一个可变参考。

  2. 在XSLT 2.0没有必要杂技表演操纵电流和索引文件-的的第三个参数key()函数是指定其索引使用树。



文章来源: Implementing Key Value Concept in XSLT
标签: xslt xslt-1.0