代码之家  ›  专栏  ›  技术社区  ›  Frerich Raabe

如何从标记存储在变量中的树中选择节点?

  •  3
  • Frerich Raabe  · 技术社区  · 16 年前

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    <xsl:output method="text" encoding="iso-8859-1"/>
    
    <xsl:variable name="stringmap">
    <map>
    <entry><key>red</key><value>rot</value></entry>
    <entry><key>green</key><value>gruen</value></entry>
    <entry><key>blue</key><value>blau</value></entry>
    </map>
    </xsl:variable>
    
    <xsl:template match="/">
    <!-- IMPLEMENT ME -->
    </xsl:template>
    
    </xsl:stylesheet>
    

    我想把这个剧本印出来 redgreenblue .

    有什么方法可以处理存储在 stringmap 变量作为我可以运行XPath查询的文档?我基本上是在找

    <xsl:for-each select="document($stringmap)/map/entry">
        <xsl:value-of select="key"/>
    </xsl:for-each>
    

    (除了 document() 函数需要一个URI)。

    <xsl:choose> 将给定字符串映射到另一个字符串的元素。我想用一个接受“map”参数(这是一个简单的XML文档)的模板来替换所有这些。我的希望是,我可以取代 <xsl:choose> 用一句简单的话 <xsl:value-of select="$stringmap/map/entry/value[../key='$givenkey']"/>

    我正在使用XSLT1.0 xsltproc .

    2 回复  |  直到 16 年前
        1
  •  5
  •   Per T    16 年前

    你几乎是对的,使用 document('') 将允许您处理当前样式表中的节点集:

    <xsl:for-each select="document('')/xsl:stylesheet/xsl:variable[@name='stringmap']/map/entry">
        <xsl:value-of select="key"/>
    </xsl:for-each>
    

    map 在本例中,节点设置为变量:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet xmlns:data="some.uri" version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
      <data:map>
        <entry><key>red</key><value>rot</value></entry>
        <entry><key>green</key><value>gruen</value></entry>
        <entry><key>blue</key><value>blau</value></entry>
      </data:map>
    
      <xsl:template match="/">
        <xsl:for-each select="document('')/xsl:stylesheet/data:map/entry">
          <xsl:value-of select="key"/>
        </xsl:for-each>
      </xsl:template>
    
    </xsl:stylesheet>
    

    xsl:variable

    在XSLT 2.0中,可以只迭代变量中的内容:

    <xsl:variable name="map">
      <entry><key>red</key><value>rot</value></entry>
      <entry><key>green</key><value>gruen</value></entry>
      <entry><key>blue</key><value>blau</value></entry>
    </xsl:variable>
    
    <xsl:template match="/">
      <xsl:for-each select="$map/entry">
        <xsl:value-of select="key"/>
      </xsl:for-each>
    </xsl:template>
    
        2
  •  0
  •   Frerich Raabe    16 年前

    A posting by M. David Peterson 只是教我怎么做:

    没有必要有一个 <xsl:variable> 为了这个案子。相反,我可以将数据文档直接嵌入到XSL样式表中(将其放入一个名称空间中以确保完整性),然后从中选择元素。结果如下:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0"
                    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:map="uri:map">
    
    <xsl:output method="text" encoding="iso-8859-1"/>
    
    <map:colors>
    <entry><key>red</key><value>rot</value></entry>
    <entry><key>green</key><value>gruen</value></entry>
    <entry><key>blue</key><value>blau</value></entry>
    </map:colors>
    
    <xsl:template match="/">
    <xsl:for-each select="document('')/*/map:colors/entry">
        <xsl:value-of select="key"/>
    </xsl:for-each>
    </xsl:template>
    
    </xsl:stylesheet>
    

    这将生成预期的输出 redgreenblue .

    诀窍是使用 document('') * 进入顶层 xsl:stylesheet 元素,从那里我可以访问颜色图。