以推送方式处理节点及其可选属性

时间:2018-02-02 17:56:41

标签: xslt xpath attributes xslt-1.0

我有一个元素t,其中包含可选属性hangTextanchor。我试图使用推送技术来处理这个问题,如果可能的话。

目标是翻译这个:

<root>
  <t>This is a normal paragraph.</t>
  <t hangText="Sometimes hanging text is needed">in paragraphs.</t>
  <t anchor="p3">Sometimes an anchor is included.</t>
</root>

到此Markdown输出:

This is a normal paragraph

**Sometimes hanging text is needed** in paragraphs.

Sometimes an anchor is included.

我尝试创建一个匹配<t>的样式表,然后分别匹配属性,但显然还不对。

尝试解决方案

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:output method="text" />
  <xsl:strip-space elements="*"/>

  <xsl:template match="t">
    <xsl:apply-templates />
    <xsl:text>&#xa;&#xa;</xsl:text>
  </xsl:template>

  <xsl:template match="@hangText">
    <xsl:text>**</xsl:text>
    <xsl:apply-templates />
    <xsl:text>** </xsl:text>
  </xsl:template>


  <xsl:template match="@anchor">
    <xsl:element name="a">
      <xsl:attribute name="name">
        <xsl:apply-templates />
      </xsl:attribute>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

输出失败

This is a normal paragraph

in paragraphs.

Sometimes an anchor is included.


我可以使用几种模式匹配<t> +属性的每种可能组合,但这会产生犯罪行为,并且无法使用其他属性进行扩展。

1 个答案:

答案 0 :(得分:0)

感谢Martin的评论,我修复了XLST,如下:

(欢迎评论是否有更好的输出锚元素的方法)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:output method="text" />
  <xsl:strip-space elements="*"/>

  <xsl:template match="t">
    <xsl:apply-templates select="@*" />
    <xsl:apply-templates />
    <xsl:text>&#xa;&#xa;</xsl:text>
  </xsl:template>

  <xsl:template match="t/@hangText">
    <xsl:text>**</xsl:text>
    <xsl:value-of select="." />
    <xsl:text>** </xsl:text>
  </xsl:template>


  <xsl:template match="t/@anchor">
    <xsl:text>&lt;a name=&quot;</xsl:text>
    <xsl:value-of select="."></xsl:value-of>
    <xsl:text>&quot;&gt;&lt;a&gt;</xsl:text>
  </xsl:template>
</xsl:stylesheet>

我还在匹配语句中添加了t/,仅将这些属性作为<t>的一部分进行匹配。

从技术上讲,它会输出一个我不期待的最终换行符,但我可以忍受。它不会影响Markdown的呈现方式。