xslproc,如何使用 document() 将模板应用到本地 xml 文件
xslproc , how to apply-templates to local xml file using document()
我遇到以下情况:3 XML 个文件来自 knime.org workbench。
$ find -type f
./workflow.knime
./File Reader (#1)/settings.xml
./CSV Writer (#2)/settings.xml
是:文件名包含空格和散列...
这是 3 个文件的快照:
$ xmllint --format ./workflow.knime
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://www.knime.org/2008/09/XMLConfig">
<config key="nodes">
<config key="node_1">
<entry key="node_settings_file" type="xstring" value="File Reader (#1)/settings.xml"/>
</config>
<config key="node_2">
<entry key="node_settings_file" type="xstring" value="CSV Writer (#2)/settings.xml"/>
</config>
</config>
</config>
$ xmllint --format File\ Reader\ \(#1\)/settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://www.knime.org/2008/09/XMLConfig">
<config key="filestores">
<entry key="file_store_id" type="xstring" value="b23a87fd-a3ff-430b-8c12-fe9186e30004"/>
</config>
</config>
$ xmllint --format CSV\ Writer\ \(#2\)/settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://www.knime.org/2008/09/XMLConfig">
<config key="filestores">
<entry key="file_store_id" type="xstring" value="ac3dde81-7363-4191-8f4c-3cba026391df"/>
</config>
</config>
我想 运行 xsltproc 和 document
来消化这 3 个文件。我尝试了以下 xslt 样式表:
<?xml version='1.0' encoding="UTF-8" ?>
<xsl:stylesheet
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
xmlns:k="http://www.knime.org/2008/09/XMLConfig"
version='1.0'
>
<xsl:output method="text" />
<xsl:template match="/">
<xsl:apply-templates select="k:config/k:config[@key='nodes']/k:config" mode="node"/>
</xsl:template>
<xsl:template match="k:config" mode="node">
<xsl:variable name="f1" select="k:entry[@key='node_settings_file']/@value"/>
<xsl:message>reading <xsl:value-of select="$f1"/></xsl:message>
<xsl:apply-templates select="document($f1)/*" mode="extdoc"/>
</xsl:template>
<xsl:template match="*" mode="extdoc">
<xsl:text>IN EXTERNAL DOC</xsl:text>
<xsl:apply-templates select="*" mode="extdoc"/>
</xsl:template>
</xsl:stylesheet>
但没有显示 "IN EXTERNAL DOC"。
$ xsltproc jeter.xsl workflow.knime
reading File Reader (#1)/settings.xml
reading CSV Writer (#2)/settings.xml
$ xsltproc --verbose jeter.xsl workflow.knime
(...)
xsltValueOf: select $f1
Lookup variable 'f1'
xsltCopyTextString: copy text CSV Writer (#2)/settings.xml
xsltValueOf: result 'CSV Writer (#2)/settings.xml'
reading CSV Writer (#2)/settings.xml
xsltApplyTemplates: node: 'config'
xsltApplyTemplates: select document($f1)/*
Lookup variable 'f1'
xsltApplyTemplates: select didn't evaluate to a node list
freeing transformation dictionary
我应该如何使用 document()
?
FIXED:在使用 str:encode-uri
时有效
<xsl:variable name="f1" select="k:entry[@key='node_settings_file']/@value"/>
<xsl:variable name="f2" select="str:encode-uri($f1,'UTF-8')"/>
<xsl:apply-templates select="document($f2)/*" mode="extdoc"/>
document
函数期望其参数是 URI 引用 而不是本机文件路径。您需要将空格、括号和散列字符编码为 %NN
转义以生成有效的 URI。
我遇到以下情况:3 XML 个文件来自 knime.org workbench。
$ find -type f
./workflow.knime
./File Reader (#1)/settings.xml
./CSV Writer (#2)/settings.xml
是:文件名包含空格和散列...
这是 3 个文件的快照:
$ xmllint --format ./workflow.knime
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://www.knime.org/2008/09/XMLConfig">
<config key="nodes">
<config key="node_1">
<entry key="node_settings_file" type="xstring" value="File Reader (#1)/settings.xml"/>
</config>
<config key="node_2">
<entry key="node_settings_file" type="xstring" value="CSV Writer (#2)/settings.xml"/>
</config>
</config>
</config>
$ xmllint --format File\ Reader\ \(#1\)/settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://www.knime.org/2008/09/XMLConfig">
<config key="filestores">
<entry key="file_store_id" type="xstring" value="b23a87fd-a3ff-430b-8c12-fe9186e30004"/>
</config>
</config>
$ xmllint --format CSV\ Writer\ \(#2\)/settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://www.knime.org/2008/09/XMLConfig">
<config key="filestores">
<entry key="file_store_id" type="xstring" value="ac3dde81-7363-4191-8f4c-3cba026391df"/>
</config>
</config>
我想 运行 xsltproc 和 document
来消化这 3 个文件。我尝试了以下 xslt 样式表:
<?xml version='1.0' encoding="UTF-8" ?>
<xsl:stylesheet
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
xmlns:k="http://www.knime.org/2008/09/XMLConfig"
version='1.0'
>
<xsl:output method="text" />
<xsl:template match="/">
<xsl:apply-templates select="k:config/k:config[@key='nodes']/k:config" mode="node"/>
</xsl:template>
<xsl:template match="k:config" mode="node">
<xsl:variable name="f1" select="k:entry[@key='node_settings_file']/@value"/>
<xsl:message>reading <xsl:value-of select="$f1"/></xsl:message>
<xsl:apply-templates select="document($f1)/*" mode="extdoc"/>
</xsl:template>
<xsl:template match="*" mode="extdoc">
<xsl:text>IN EXTERNAL DOC</xsl:text>
<xsl:apply-templates select="*" mode="extdoc"/>
</xsl:template>
</xsl:stylesheet>
但没有显示 "IN EXTERNAL DOC"。
$ xsltproc jeter.xsl workflow.knime
reading File Reader (#1)/settings.xml
reading CSV Writer (#2)/settings.xml
$ xsltproc --verbose jeter.xsl workflow.knime
(...)
xsltValueOf: select $f1
Lookup variable 'f1'
xsltCopyTextString: copy text CSV Writer (#2)/settings.xml
xsltValueOf: result 'CSV Writer (#2)/settings.xml'
reading CSV Writer (#2)/settings.xml
xsltApplyTemplates: node: 'config'
xsltApplyTemplates: select document($f1)/*
Lookup variable 'f1'
xsltApplyTemplates: select didn't evaluate to a node list
freeing transformation dictionary
我应该如何使用 document()
?
FIXED:在使用 str:encode-uri
时有效<xsl:variable name="f1" select="k:entry[@key='node_settings_file']/@value"/>
<xsl:variable name="f2" select="str:encode-uri($f1,'UTF-8')"/>
<xsl:apply-templates select="document($f2)/*" mode="extdoc"/>
document
函数期望其参数是 URI 引用 而不是本机文件路径。您需要将空格、括号和散列字符编码为 %NN
转义以生成有效的 URI。