将文本字符串转换为XML标记使用XSL?

huangapple go评论58阅读模式
英文:

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
&lt;p&gt;!!!This should be a note&lt;/p&gt;

is it possible to convert the &lt;p&gt; tags to &lt;note&gt; tags using XSL (maybe using the !!! as an identifier?). Note that there would be other &lt;p&gt; tags that I wouldn't want to be converted. So the result would be

&lt;note&gt;!!!This should be a note&lt;/note&gt;

or

&lt;note&gt;This should be a note&lt;/note&gt;

Also, if I have

&lt;p&gt;This is an apiname&lt;/p&gt;

and I want to use XSL to surround 'apiname' with &lt;apiname&gt; tags, example:

&lt;p&gt;This is an &lt;apiname&gt;apiname&lt;/apiname&gt;&lt;/p&gt;

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 问题,我建议您提出一个单独的问题,并澄清以下内容:

  1. apiname 到底是什么?它是字面字符串 "apiname" 吗?
  2. 一个 p 元素是否可以包含多个 apiname 的出现?
  3. 您的处理器支持哪个 XSLT 版本
英文:

To convert only p elements that start with !!! to note elements, you could do simply:

XSLT 1.0

&lt;xsl:stylesheet version=&quot;1.0&quot; 
xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;&gt;
&lt;xsl:output method=&quot;xml&quot; version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; indent=&quot;yes&quot;/&gt;
&lt;xsl:strip-space elements=&quot;*&quot;/&gt;

&lt;!-- identity transform --&gt;
&lt;xsl:template match=&quot;@*|node()&quot;&gt;
	&lt;xsl:copy&gt;
		&lt;xsl:apply-templates select=&quot;@*|node()&quot;/&gt;
	&lt;/xsl:copy&gt;
&lt;/xsl:template&gt;

&lt;xsl:template match=&quot;p[starts-with(., &#39;!!!&#39;)]&quot;&gt;
	&lt;note&gt;
		&lt;xsl:apply-templates/&gt;
	&lt;/note&gt;
&lt;/xsl:template&gt;

&lt;/xsl:stylesheet&gt;

If you also want to remove the !!! identifier, change the 2nd template to:

&lt;xsl:template match=&quot;p[starts-with(., &#39;!!!&#39;)]&quot;&gt;
	&lt;note&gt;
		&lt;xsl:value-of select=&quot;substring-after(., &#39;!!!&#39;)&quot; /&gt;
	&lt;/note&gt;
&lt;/xsl:template&gt;

I suggest you ask a separate question regarding the apiname problem, and clarify:

  1. What exactly is apiname? Is it the literal string "apiname"?
  2. Can a p contain more than one occurrence of apiname?
  3. 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 &lt;p&gt; tags to &lt;note&gt; tags using XSL?

Yes. You can use the following template:

&lt;xsl:template match=&quot;p&quot;&gt;
  &lt;xsl:element name=&quot;note&quot;&gt;
    &lt;xsl:apply-templates select=&quot;node()|@*&quot; /&gt;
  &lt;/xsl:element&gt;
&lt;/xsl:template&gt;   

If you want to transform only the &lt;p&gt; elements whose text() content starts with "!!!", use

&lt;xsl:template match=&quot;p[starts-with(.,&#39;!!!&#39;)]&quot;&gt;   ...

> 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

&lt;xsl:variable name=&quot;api_replace&quot; select=&quot;&#39;apinamereplacement&#39;&quot; /&gt;
&lt;xsl:variable name=&quot;api&quot; select=&quot;&#39;apiname&#39;&quot; /&gt;

&lt;xsl:template match=&quot;p[contains(text(),&#39;apiname&#39;)]&quot;&gt;
  &lt;xsl:copy&gt;
    &lt;xsl:copy-of select=&quot;@*&quot; /&gt;
    &lt;xsl:value-of select=&quot;substring-before(text(),$api)&quot; /&gt;
    &lt;xsl:element name=&quot;{$api_replace}&quot;&gt;
      &lt;xsl:value-of select=&quot;$api&quot; /&gt;
    &lt;/xsl:element&gt;
    &lt;xsl:value-of select=&quot;substring-after(text(),$api)&quot; /&gt;
  &lt;/xsl:copy&gt;
&lt;/xsl:template&gt;

A complete template could look like this:

&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;xsl:stylesheet version=&quot;1.0&quot; xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot; xmlns:fo=&quot;http://www.w3.org/1999/XSL/Format&quot;&gt;
  &lt;xsl:output method=&quot;xml&quot; indent=&quot;yes&quot;/&gt;
  &lt;xsl:variable name=&quot;api_replace&quot; select=&quot;&#39;apinamereplacement&#39;&quot; /&gt;
  &lt;xsl:variable name=&quot;api&quot; select=&quot;&#39;apiname&#39;&quot; /&gt;
  
  &lt;xsl:template match=&quot;node()|@*&quot;&gt;
    &lt;xsl:copy&gt;
      &lt;xsl:apply-templates select=&quot;node()|@*&quot; /&gt;
    &lt;/xsl:copy&gt;
  &lt;/xsl:template&gt;
  
  &lt;xsl:template match=&quot;p&quot;&gt;
    &lt;xsl:element name=&quot;note&quot;&gt;
      &lt;xsl:apply-templates select=&quot;node()|@*&quot; /&gt;
    &lt;/xsl:element&gt;
  &lt;/xsl:template&gt;
  
  &lt;xsl:template match=&quot;p[contains(text(),&#39;apiname&#39;)]&quot;&gt;
    &lt;xsl:copy&gt;
      &lt;xsl:copy-of select=&quot;@*&quot; /&gt;
      &lt;xsl:value-of select=&quot;substring-before(text(),$api)&quot; /&gt;
      &lt;xsl:element name=&quot;{$api_replace}&quot;&gt;
        &lt;xsl:value-of select=&quot;$api&quot; /&gt;
      &lt;/xsl:element&gt;
      &lt;xsl:value-of select=&quot;substring-after(text(),$api)&quot; /&gt;
    &lt;/xsl:copy&gt;
  &lt;/xsl:template&gt;
  
&lt;/xsl:stylesheet&gt;

huangapple
  • 本文由 发表于 2023年7月5日 01:31:46
  • 转载请务必保留本文链接:https://go.coder-hub.com/76614803.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定