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{| に変換され、charcter{が来ると |cbo| に変換されます。

XML が XML パーサーを通過すると、これら 2 つの入力は区別できなくなります。これは、作成者が左手でテキストを入力したか右手でテキストを入力したかに応じて、それらを異なる方法で処理したいと言っているようなものです。これらは、同じデータを入力する方法が異なるだけです。

それらを区別したい場合は、何らかの前処理を行って、XML 解析によって違いが保持されるようにする必要があります。これを行う 1 つの方法は、KernowForSaxon と統合されている Andrew Welch の Lexev ツールです。しかし、私はあなたのデザインに疑問を持ちます。このような字句の違いに依存すると、システムが非常に壊れやすくなります。

于 2013-01-07T09:05:37.997 に答える