我有一个ggplot(data=tdat, aes(x=time,y=value)) +
geom_bar(stat="identity")+
facet_grid(rows = vars(variable), cols = vars(B),
labeller = plot_labeller, scales="free_y", switch = 'y')
,其中包含节点列表。当我尝试使用for-each遍历它们时,没有任何结果。我正在使用saxon655和Java 1.8.0_181。
这是xslt:
xsl:variable
xml:
<?xml version="1.0"?>
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml"
xmlns:exsl="http://exslt.org/common"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="exsl"
version="1.0">
<xsl:variable name="products">
<array>
<item><name>Scooby</name><value>Doo</value></item>
<item><name>snack</name><value>cookies</value></item>
</array>
</xsl:variable>
<xsl:template match="/">
<xsl:for-each select="exsl:node-set($products)">
<xsl:message>LOOP</xsl:message>
<xsl:value-of select=".//name" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
最后,我的命令:
<?xml version='1.0' encoding='UTF-8'?>
<book>
text
</book>
运行命令时,我会收到一行输出/usr/bin/java -cp /usr/local/share/saxon/saxon.jar com.icl.saxon.StyleSheet test.xml test_run.xsl
。
我希望为变量数组中的每个项目一次获取消息和LOOP
的值。
答案 0 :(得分:2)
执行exsl:node-set($products)
返回一个文档节点,该节点在变量中包含XML的其余部分,因此您需要做的是...
<xsl:for-each select="exsl:node-set($products)/array/item">
但是,这不能立即生效,因为您在XSLT(xmlns="http://www.w3.org/1999/xhtml"
)中定义了默认的名称空间声明。这意味着未加前缀的变量中的元素将在该命名空间中。
因此,除非您有理由在命名空间中使用array
和item
,否则像这样声明变量
<xsl:variable name="products" xmlns="">
尝试使用此XSLT
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml"
xmlns:exsl="http://exslt.org/common"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="exsl"
version="1.0">
<xsl:variable name="products" xmlns="">
<array>
<item><name>Scooby</name><value>Doo</value></item>
<item><name>snack</name><value>cookies</value></item>
</array>
</xsl:variable>
<xsl:template match="/">
<xsl:for-each select="exsl:node-set($products)/array/item">
<xsl:value-of select="name" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
或者,如果您需要在命名空间中使用array
和item
,则可以这样处理它们:
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:exsl="http://exslt.org/common"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="exsl"
version="1.0">
<xsl:variable name="products">
<array>
<item><name>Scooby</name><value>Doo</value></item>
<item><name>snack</name><value>cookies</value></item>
</array>
</xsl:variable>
<xsl:template match="/">
<xsl:for-each select="exsl:node-set($products)/xhtml:array/xhtml:item">
<xsl:value-of select="xhtml:name" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>