0

我需要根据元素中的字符转换下面的 XML。我已经尝试过以下 XSLT 1.0。在<mo>元素中,for&#x007B;&#x007D;, 应该转换为 |text{| 和 |文本}| 分别。For {and}应该转换为 |cbo| 和 |cbc| 分别。但我得到 '|(text}||(text{||(text}||(text{| for the contents in` 元素

示例 XML:

<chapter xmlns="http://www.w3.org/1998/Math/MathML"><p><math display='block'><mo>{</mo><mo>&#x007B;</mo><mo>&#x007D;</mo><mo>}</mo></math></p></chapter>

XSLT 1.0 试过:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:mml="http://www.w3.org/1998/Math/MathML">
<xsl:output method="xml" encoding="UTF-8" indent="no"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@* | node()"><xsl:copy><xsl:apply-templates select="@* | node()"/>    
</xsl:copy></xsl:template>
<xsl:template match="m:mo">
<xsl:choose>
<xsl:when test="(.)='&#x007B;'"><xsl:text disable-output-escaping="yes">|(text{|</xsl:text>
</xsl:when>
<xsl:when test="(.)='&#x007D;'"><xsl:text disable-output-escaping="yes">|(text}|</xsl:text>
</xsl:when>
<xsl:when test="(.)='{'"><xsl:text disable-output-escaping="yes">|cbo|</xsl:text></xsl:when>
<xsl:when test="(.)='}'"><xsl:text disable-output-escaping="yes">|cbc|</xsl:text></xsl:when>
</xsl:choose></xsl:template></xsl:stylesheet>
4

2 回答 2

1

我无法重现“问题” ——提供的 XSLT 代码生成的输出不包含以下子字符串:

"|(text}||(text{||(text}||(text{|"

提供的不可读代码可以简化为以下简单代码——请注意,根本不需要 DOE:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:m="http://www.w3.org/1998/Math/MathML">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

 <xsl:template match="@* | node()">
   <xsl:copy>
     <xsl:apply-templates select="@* | node()"/>
   </xsl:copy>
 </xsl:template>

 <xsl:template match="m:mo">
   <xsl:choose>
    <xsl:when test=". = '&#x007B;'">
     <xsl:text>|(text{|</xsl:text>
    </xsl:when>
    <xsl:when test=". = '&#x007D;'">
     <xsl:text>|(text}|</xsl:text>
    </xsl:when>
    <xsl:when test=". = '{'">
     <xsl:text>|cbo|</xsl:text>
    </xsl:when>
    <xsl:when test=". = '}'">
     <xsl:text>|cbc|</xsl:text>
    </xsl:when>
   </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

原始代码及其等效的可读和简化代码(上图)都产生相同的结果(当我们不考虑缩进或缺少缩进时):

<chapter xmlns="http://www.w3.org/1998/Math/MathML">
   <p>
      <math display="block">|(text{||(text{||(text}||(text}|</math>
   </p>
</chapter>

我不知道这个结果是“好”还是“坏”,因为 OP 没有具体说明他想要产生什么结果,他得到什么结果,以及为什么他得到的结果不是“好” ”。

于 2013-01-07T05:43:42.813 回答
1

当实体&#x007B;进入时,它应该被转换为|(text{|,当字符{出现时,它应该被转换为|cbo|。

一旦您的 XML 通过 XML 解析器,这两个输入就无法区分了。这有点像说你想根据作者是用左手还是右手输入文本来不同地处理它们——它们只是输入相同数据的不同方式。

如果要区分它们,则需要进行某种预处理,以便通过 XML 解析保留差异。一种方法是 Andrew Welch 的 Lexev 工具,它与 KernowForSaxon 集成。但是,我会质疑您的设计;取决于这样的词汇差异将使您的系统非常脆弱。

于 2013-01-07T09:05:37.997 回答