英文:
Convert text string to xml tagging using xsl?
问题
如果我有
```xml
<p>!!!This should be a note</p>
是否可以使用XSL(也许可以使用 !!! 作为标识符)将 <p>
标签转换为 <note>
标签?请注意,还会有其他 <p>
标签,我不希望它们被转换。所以结果可能是
<note>!!!This should be a note</note>
或
<note>This should be a note</note>
另外,如果我有
<p>This is an apiname</p>
并且我想使用XSL将 'apiname' 包围在 <apiname>
标签中,例如:
<p>This is an <apiname>apiname</apiname></p>
是否有办法做到这一点?
我正在使用DITA Open Toolkit编写Markdown,然后在后台将其转换为XML。然后,XSL被应用于XML以显示HTML和其他格式。这就是为什么我不能直接从源更改XML的原因。
<details>
<summary>英文:</summary>
If I have
```xml
<p>!!!This should be a note</p>
is it possible to convert the <p>
tags to <note>
tags using XSL (maybe using the !!! as an identifier?). Note that there would be other <p>
tags that I wouldn't want to be converted. So the result would be
<note>!!!This should be a note</note>
or
<note>This should be a note</note>
Also, if I have
<p>This is an apiname</p>
and I want to use XSL to surround 'apiname' with <apiname>
tags, example:
<p>This is an <apiname>apiname</apiname></p>
is there a way to do this?
I'm using DITA Open Toolkit to write Markdown, which is then converted to XML behind the scenes. Then, XSL is applied to the XML to display HTML and other formats. This is why I can't just update the XML from the source.
答案1
得分: 1
要将以 "!!!" 开头的 p
元素转换为 note
元素,您可以简单地使用以下 XSLT 1.0 代码:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="p[starts-with(., '!!!')]">
<note>
<xsl:apply-templates/>
</note>
</xsl:template>
</xsl:stylesheet>
如果您还想删除 !!!
标识符,将第二个模板更改为:
<xsl:template match="p[starts-with(., '!!!')]">
<note>
<xsl:value-of select="substring-after(., '!!!')" />
</note>
</xsl:template>
关于 apiname
问题,我建议您提出一个单独的问题,并澄清以下内容:
apiname
到底是什么?它是字面字符串 "apiname" 吗?- 一个
p
元素是否可以包含多个apiname
的出现? - 您的处理器支持哪个 XSLT 版本?
英文:
To convert only p
elements that start with !!!
to note
elements, you could do simply:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="p[starts-with(., '!!!')]">
<note>
<xsl:apply-templates/>
</note>
</xsl:template>
</xsl:stylesheet>
If you also want to remove the !!!
identifier, change the 2nd template to:
<xsl:template match="p[starts-with(., '!!!')]">
<note>
<xsl:value-of select="substring-after(., '!!!')" />
</note>
</xsl:template>
I suggest you ask a separate question regarding the apiname
problem, and clarify:
- What exactly is
apiname
? Is it the literal string "apiname"? - Can a
p
contain more than one occurrence ofapiname
? - Which version of XSLT does your processor support?
答案2
得分: -1
以下是翻译好的部分:
is it possible to convert the
<p>
tags to<note>
tags using XSL?
是的,您可以使用以下模板:
<xsl:template match="p">
<xsl:element name="note">
<xsl:apply-templates select="node()|@*" />
</xsl:element>
</xsl:template>
如果您只想转换那些<p>
元素的text()
内容以"!!!"开头的话,可以使用:
<xsl:template match="p[starts-with(.,'!!!')]">
...
and I want to use XSL to surround 'apiname' with
<apiname>
tags
同样可以,使用以下模板:
注意:在XSLT-1.0中,您不能在匹配规则的模板中使用全局变量
<xsl:variable name="api_replace" select="'apinamereplacement'" />
<xsl:variable name="api" select="'apiname'" />
<xsl:template match="p[contains(text(),'apiname')]">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:value-of select="substring-before(text(),$api)" />
<xsl:element name="{$api_replace}">
<xsl:value-of select="$api" />
</xsl:element>
<xsl:value-of select="substring-after(text(),$api)" />
</xsl:copy>
</xsl:template>
完整的模板可能如下所示:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="api_replace" select="'apinamereplacement'" />
<xsl:variable name="api" select="'apiname'" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="p">
<xsl:element name="note">
<xsl:apply-templates select="node()|@*" />
</xsl:element>
</xsl:template>
<xsl:template match="p[contains(text(),'apiname')]">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:value-of select="substring-before(text(),$api)" />
<xsl:element name="{$api_replace}">
<xsl:value-of select="$api" />
</xsl:element>
<xsl:value-of select="substring-after(text(),$api)" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
英文:
> is it possible to convert the <p>
tags to <note>
tags using XSL?
Yes. You can use the following template:
<xsl:template match="p">
<xsl:element name="note">
<xsl:apply-templates select="node()|@*" />
</xsl:element>
</xsl:template>
If you want to transform only the <p>
elements whose text()
content starts with "!!!", use
<xsl:template match="p[starts-with(.,'!!!')]"> ...
> and I want to use XSL to surround 'apiname' with <apiname> tags
Also yes, use the following template:
Remark: you can't use a global variable in a template matching rule in XSLT-1.0
<xsl:variable name="api_replace" select="'apinamereplacement'" />
<xsl:variable name="api" select="'apiname'" />
<xsl:template match="p[contains(text(),'apiname')]">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:value-of select="substring-before(text(),$api)" />
<xsl:element name="{$api_replace}">
<xsl:value-of select="$api" />
</xsl:element>
<xsl:value-of select="substring-after(text(),$api)" />
</xsl:copy>
</xsl:template>
A complete template could look like this:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="api_replace" select="'apinamereplacement'" />
<xsl:variable name="api" select="'apiname'" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="p">
<xsl:element name="note">
<xsl:apply-templates select="node()|@*" />
</xsl:element>
</xsl:template>
<xsl:template match="p[contains(text(),'apiname')]">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:value-of select="substring-before(text(),$api)" />
<xsl:element name="{$api_replace}">
<xsl:value-of select="$api" />
</xsl:element>
<xsl:value-of select="substring-after(text(),$api)" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论