使用处理指令在 XSLT 中设置变量
Using processing instructions to set a variable in XSLT
我正在将 asciidoc 与 docbook 后端一起使用,并且我正在尝试将 URL 作为变量从 asciidoc 传递到 docbook,其中变量在整个文档中可以具有不同的值。例如,我希望我的用户能够执行以下操作:
# url="http://foo/
== some text
Some para....
# url="http://bar/
== some text
Some para....
我的想法是使用 pass through 块来添加可以在 docbook 中获取的处理指令,例如:
pass::[<?my_url http://foo ?>]
== some title
some para...
我不知道该怎么做的是编写表达以下内容的 XSLT:"find the previous processing-instruction called my_url
and use its contents to set the value of a variable"
按照 http://www.sagehill.net/docbookxsl/ProcessingInstructions.html 中给出的指导,我尝试使用 dbhtml
PI,例如:
<?dbhtml my_url="http://foo.com" ?>
在我的 XSL 中:
<xsl:template match="ulink[@role='edit_me']">
<xsl:variable name="my_url">
<xsl:call-template name="dbhtml-attribute">
<xsl:with-param name="pis"
select="ancestor-or-self::entry/processing-instruction('dbhtml')"/>
<xsl:with-param name="attribute" select="'my_url'"/>
</xsl:call-template>
</xsl:variable>
GOT: <xsl:value-of select="$my_url" />
</xsl:template>
但我完全无法检索到我想要的值。不胜感激。
添加示例XML
例如,拿这个例子XML文档:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<book lang="en">
<bookinfo>
<title>Title one</title>
</bookinfo>
<?my_url http://foo.com ?>
<preface>
<title><ulink role="edit_me" url="test.asciidoc">Edit me</ulink></title>
</preface>
<?my_url http://bar.com ?>
<chapter id="_title_two">
<title>Title two<ulink role="edit_me" url="test.asciidoc">Edit me</ulink></title>
<simpara>Some text</simpara>
</chapter>
<chapter id="_title_three">
<title>Title three<ulink role="edit_me" url="test.asciidoc">Edit me</ulink></title>
<simpara>More text</simpara>
</chapter>
</book>
我想使用前面的 my_url
处理指令中指定的 URL 来呈现每个 edit_me
link。所以第一个 link 将使用 foo.com
,而接下来的两个将使用 bar.com
.
您正在使用:
select="ancestor-or-self::entry/processing-instruction('dbhtml')"
但是您的示例中没有 entry
,所有处理指令都是根 book
元素的子元素。
听起来你真的很想获取最近的前面处理指令的值。例如,应用:
<xsl:template match="ulink[@role='edit_me']">
<xsl:copy>
<xsl:attribute name="url">
<xsl:value-of select="preceding::processing-instruction('my_url')[1]"/>
</xsl:attribute>
</xsl:copy>
</xsl:template>
(连同身份转换模板和抑制处理指令的模板)将导致:
<?xml version="1.0" encoding="utf-8"?>
<book lang="en">
<bookinfo>
<title>Title one</title>
</bookinfo>
<preface>
<title>
<ulink url="http://foo.com "/>
</title>
</preface>
<chapter id="_title_two">
<title>Title two<ulink url="http://bar.com "/>
</title>
<simpara>Some text</simpara>
</chapter>
<chapter id="_title_three">
<title>Title three<ulink url="http://bar.com "/>
</title>
<simpara>More text</simpara>
</chapter>
</book>
这个简短而完整的转换使用并覆盖了身份规则。
请注意没有使用<xsl:attribute>
(真的没必要):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ulink[. = 'Edit me']">
<ulink role="{@role}" url="{preceding::processing-instruction('my_url')[1]}">
<xsl:apply-templates/>
</ulink>
</xsl:template>
<xsl:template match="processing-instruction()"/>
</xsl:stylesheet>
当此转换应用于提供的源 XML 文档时:
<book lang="en">
<bookinfo>
<title>Title one</title>
</bookinfo>
<?my_url http://foo.com ?>
<preface>
<title>
<ulink role="edit_me" url="test.asciidoc">Edit me</ulink>
</title>
</preface>
<?my_url http://bar.com ?>
<chapter id="_title_two">
<title>Title two
<ulink role="edit_me" url="test.asciidoc">Edit me</ulink>
</title>
<simpara>Some text</simpara>
</chapter>
<chapter id="_title_three">
<title>Title three
<ulink role="edit_me" url="test.asciidoc">Edit me</ulink>
</title>
<simpara>More text</simpara>
</chapter>
</book>
产生了想要的正确结果:
<book lang="en">
<bookinfo>
<title>Title one</title>
</bookinfo>
<preface>
<title>
<ulink role="edit_me" url="http://foo.com ">Edit me</ulink>
</title>
</preface>
<chapter id="_title_two">
<title>Title two
<ulink role="edit_me" url="http://bar.com ">Edit me</ulink>
</title>
<simpara>Some text</simpara>
</chapter>
<chapter id="_title_three">
<title>Title three
<ulink role="edit_me" url="http://bar.com ">Edit me</ulink>
</title>
<simpara>More text</simpara>
</chapter>
</book>
我正在将 asciidoc 与 docbook 后端一起使用,并且我正在尝试将 URL 作为变量从 asciidoc 传递到 docbook,其中变量在整个文档中可以具有不同的值。例如,我希望我的用户能够执行以下操作:
# url="http://foo/
== some text
Some para....
# url="http://bar/
== some text
Some para....
我的想法是使用 pass through 块来添加可以在 docbook 中获取的处理指令,例如:
pass::[<?my_url http://foo ?>]
== some title
some para...
我不知道该怎么做的是编写表达以下内容的 XSLT:"find the previous processing-instruction called my_url
and use its contents to set the value of a variable"
按照 http://www.sagehill.net/docbookxsl/ProcessingInstructions.html 中给出的指导,我尝试使用 dbhtml
PI,例如:
<?dbhtml my_url="http://foo.com" ?>
在我的 XSL 中:
<xsl:template match="ulink[@role='edit_me']">
<xsl:variable name="my_url">
<xsl:call-template name="dbhtml-attribute">
<xsl:with-param name="pis"
select="ancestor-or-self::entry/processing-instruction('dbhtml')"/>
<xsl:with-param name="attribute" select="'my_url'"/>
</xsl:call-template>
</xsl:variable>
GOT: <xsl:value-of select="$my_url" />
</xsl:template>
但我完全无法检索到我想要的值。不胜感激。
添加示例XML
例如,拿这个例子XML文档:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
<book lang="en">
<bookinfo>
<title>Title one</title>
</bookinfo>
<?my_url http://foo.com ?>
<preface>
<title><ulink role="edit_me" url="test.asciidoc">Edit me</ulink></title>
</preface>
<?my_url http://bar.com ?>
<chapter id="_title_two">
<title>Title two<ulink role="edit_me" url="test.asciidoc">Edit me</ulink></title>
<simpara>Some text</simpara>
</chapter>
<chapter id="_title_three">
<title>Title three<ulink role="edit_me" url="test.asciidoc">Edit me</ulink></title>
<simpara>More text</simpara>
</chapter>
</book>
我想使用前面的 my_url
处理指令中指定的 URL 来呈现每个 edit_me
link。所以第一个 link 将使用 foo.com
,而接下来的两个将使用 bar.com
.
您正在使用:
select="ancestor-or-self::entry/processing-instruction('dbhtml')"
但是您的示例中没有 entry
,所有处理指令都是根 book
元素的子元素。
听起来你真的很想获取最近的前面处理指令的值。例如,应用:
<xsl:template match="ulink[@role='edit_me']">
<xsl:copy>
<xsl:attribute name="url">
<xsl:value-of select="preceding::processing-instruction('my_url')[1]"/>
</xsl:attribute>
</xsl:copy>
</xsl:template>
(连同身份转换模板和抑制处理指令的模板)将导致:
<?xml version="1.0" encoding="utf-8"?>
<book lang="en">
<bookinfo>
<title>Title one</title>
</bookinfo>
<preface>
<title>
<ulink url="http://foo.com "/>
</title>
</preface>
<chapter id="_title_two">
<title>Title two<ulink url="http://bar.com "/>
</title>
<simpara>Some text</simpara>
</chapter>
<chapter id="_title_three">
<title>Title three<ulink url="http://bar.com "/>
</title>
<simpara>More text</simpara>
</chapter>
</book>
这个简短而完整的转换使用并覆盖了身份规则。
请注意没有使用<xsl:attribute>
(真的没必要):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ulink[. = 'Edit me']">
<ulink role="{@role}" url="{preceding::processing-instruction('my_url')[1]}">
<xsl:apply-templates/>
</ulink>
</xsl:template>
<xsl:template match="processing-instruction()"/>
</xsl:stylesheet>
当此转换应用于提供的源 XML 文档时:
<book lang="en">
<bookinfo>
<title>Title one</title>
</bookinfo>
<?my_url http://foo.com ?>
<preface>
<title>
<ulink role="edit_me" url="test.asciidoc">Edit me</ulink>
</title>
</preface>
<?my_url http://bar.com ?>
<chapter id="_title_two">
<title>Title two
<ulink role="edit_me" url="test.asciidoc">Edit me</ulink>
</title>
<simpara>Some text</simpara>
</chapter>
<chapter id="_title_three">
<title>Title three
<ulink role="edit_me" url="test.asciidoc">Edit me</ulink>
</title>
<simpara>More text</simpara>
</chapter>
</book>
产生了想要的正确结果:
<book lang="en">
<bookinfo>
<title>Title one</title>
</bookinfo>
<preface>
<title>
<ulink role="edit_me" url="http://foo.com ">Edit me</ulink>
</title>
</preface>
<chapter id="_title_two">
<title>Title two
<ulink role="edit_me" url="http://bar.com ">Edit me</ulink>
</title>
<simpara>Some text</simpara>
</chapter>
<chapter id="_title_three">
<title>Title three
<ulink role="edit_me" url="http://bar.com ">Edit me</ulink>
</title>
<simpara>More text</simpara>
</chapter>
</book>