请考虑以下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 .
你几乎是正确的,使用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)