我想创建临时文档,以便我可以重新排序它们,并澄清浓密的编程。 我不明白我观察到的行为:如果我执行而没有将我的代码封装在变量中,它会按照我的意愿执行,但只要我将它集成到变量就会脱轨。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- I want a XML output !!! Help !!! Help !!! Help !!! -->
<xsl:output name="format-tempxml" method="xml" indent="yes" omit-xml-declaration="yes"/>
<!-- without a variable -->
<xsl:template name="template-novar">
<xsl:result-document href="novar.xml" format="format-tempxml">
<!-- xsl:variable name="variable-node" as="node()" -->
<xsl:element name="root"><xsl:value-of select="'route'" /></xsl:element>
<!-- /xsl:variable -->
</xsl:result-document>
<xsl:value-of select="concat($variable-node/root, '
')" />
</xsl:template>
<!-- with a variable -->
<xsl:variable name="variable-node">
<xsl:element name="root"><xsl:value-of select="'route'" /></xsl:element>
</xsl:variable>
<xsl:template name="template-var">
<xsl:result-document href="var.xml" format="format-tempxml">
<xsl:apply-templates select="$variable-node" />
</xsl:result-document>
<xsl:value-of select="concat($variable-node/root, '
')" />
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>route
<root>route</root>
<?xml version="1.0" encoding="UTF-8"?>route
route
xsl:output
omit-xml-declaration
元素(忽略concat($variable-node/root, '
')
)novar
不会导致{{1}}模板中的变量未找到条件?Merciàquisauraéclairersma lanterne!
答案 0 :(得分:1)
关于您对该变量的问题,您有一个全局xsl:variable name="variable-node"
,它适用于您调用的任何模板。
对于“缺失”的XML,您执行<xsl:apply-templates select="$variable-node" />
但没有设置模板,因此使用仅复制文本节点的内置模板。我不确定您是否真的使用XSLT 3处理器作为您的3.0
版本建议,但如果您这样做,可以添加<xsl:mode on-no-match="shadow-copy"/>
以使用不同的行为复制每个节点,使用XSLT 2处理器需要添加身份转换模板。
对于XML声明,主要结果设置没有未命名的xsl:output
,因此使用默认值。
答案 1 :(得分:1)
这种架构适合我想做的事情。 非常感谢Honnen先生和凯先生。
df['SPY-shifted'] = df['SPY'].shift(1)
print(df)
SPY SPY-shifted
2008-01-02 38.47 NaN
2008-01-03 38.20 38.47
2008-01-04 37.33 38.20
2008-01-07 37.71 37.33
2008-01-08 36.21 37.71
2008-01-09 36.72 36.21
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs" >
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:variable name="variable-node">
<root>route
<child>D55
<position>2</position>
</child>
<child>T40
<position>1</position>
</child>
</root>
</xsl:variable>
<xsl:template name="template-var">
<xsl:apply-templates select="$variable-node" />
</xsl:template>
<xsl:template match="root">
<xsl:result-document href="var.xml">
<root><xsl:value-of select="text()" />
<xsl:for-each select="child">
<xsl:sort select="position"/>
<child><xsl:value-of select="text()" />
<position><xsl:value-of select="position" /></position>
</child>
</xsl:for-each>
</root>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
这里有很多要点。
首先,您没有显示整个输出。使用template-novar入口点运行时,有两个输出:主要输出(默认写入控制台):
<?xml version="1.0" encoding="UTF-8"?>route
和辅助输出(写入novar.xml):
<root>route</root>
使用template-var入口点运行时,主要输出是:
<?xml version="1.0" encoding="UTF-8"?>route
和辅助输出(写入var.xml)是:
route
所以问题的答案是:
- 为什么在我查看变量时生成的文档不再是XML? (以及如何纠正这个问题?)
醇>
嗯,实际上var.xml是XML,但它是一个只包含单个文本节点的XML文档。该变量包含一个名为<root>
的元素,您将模板应用于此元素,但没有匹配的模板规则,因此内置模板规则启动,并且只复制文本节点。
- 为什么忽略xsl:output元素(忽略omit-xml-declaration)
醇>
不被忽视。此输出声明用于辅助结果文档,但不用于主体结果(使用未命名的输出声明)。您的辅助结果文档没有XML声明。
- 为什么concat($ variable-node / root,' ')不会在novar模板中导致变量未找到条件?
醇>
因为XSLT中的全局变量在任何地方都可见,甚至在它们被声明之前。
最后,在评论马丁的答案时,你说:
不幸的是,Debian只允许在不稳定的仓库中使用Saxon HE 9.7
可能是Debian制作特定版本的Saxon HE“开箱即用”,但如果它阻止您通过从Sourceforge或www下载安装任何版本的Saxon,我会感到非常惊讶。 saxonica.com。