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

Fre*_*abe 3 xslt

请考虑以下XSLT脚本:

<?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>
Run Code Online (Sandbox Code Playgroud)

我想要打印这个脚本redgreenblue.

有没有办法将存储在stringmap变量中的XML标记视为自己的文档,我可以运行XPath查询?我基本上都在寻找类似的东西

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

(除了document()函数需要URI).

动机:我有各种长<xsl:choose>元素,它们将给定的字符串映射到另一个字符串.我想用一个带有'map'参数的模板(这是一个简单的XML文档)替换所有这些模板.我的希望是我可以<xsl:choose>用一个简单的声明代替<xsl:value-of select="$stringmap/map/entry/value[../key='$givenkey']"/>

我正在使用xsltproc使用XSLT 1.0 .

Per*_*r T 5

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

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

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>
Run Code Online (Sandbox Code Playgroud)

如果不使用xsl:variable包装器,则必须记住顶级元素必须具有非空名称空间URI.

在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>
Run Code Online (Sandbox Code Playgroud)