2016-03-31 15 views
0

Gerçekten de Google Tabloları'ndan XML'e ve LaTeX'e dönüşümde temel bir şeyle uğraşıyorum. Benim asıl problemim şudur: ampersandlardan bir uçtan diğerine geçmek.Ampersand, XSLT ve LaTeX

Benzer soruların birkaç kez yanıtlandığını biliyorum, ancak çalışan bir çözüm yok gibi görünüyor. (Şimdiye kadarki en iyi yardım bana şu şekilde geliyor: xslt 2.0 how replace $ by escaped dollar (for conversion to LaTeX))

Google Tablolarda "Simon & Schuster" yayınevi olduğunu varsayalım. Bunu dışa ve XML içe sonra açıklanmıştır: LaTeX'te Şimdi

<xml> 
    <name> 
    <publisher>Simon &amp; Schuster</publisher> 
    </name> 
</xml> 

Ben ve işareti-sorunu en aza indirmek için bu yüzden yeni bir emir hazırlanan:

\newcommand{\ampersand}{\&} 

Yetişmem XSLT (2.0) o (çok) s olsun zor:

<xsl:function name="foo:ampersand-replace"> 
    <xsl:param name="passed-string"/> 
    <xsl:value-of select="replace($passed-string, '\&amp', '\\\ampersand')"/> 
    </xsl:function> 

    <xsl:template match="publisher"> 
    <xsl:value of select="foo:ampersand-replace(publisher)"/> 
    </xsl:template> 

çünkü bu derlenmez (Saxxon 9.6). Sorun elbette Ampersan: Sözdizimi Hatası Kaçış karakterine izin verilmez.

Çok farklı bir yaklaşım çalıştı:

<xml> 
    <name> 
    <publisher>Simon <c rendition="#ampersand"/> Schuster</publisher> 
    </name> 
</xml> 

c değil gibi, hem de

<xsl:value-of/> 

-command kullanamaz ki orada sorun işlenmiş. Neyi yanlış anladım?

cevap

1

senin xsl:function ihtiyaçları şöyle görünecek şekilde düşünüyorum:

<xsl:function name="foo:ampersand-replace"> 
    <xsl:param name="passed-string"/> 
    <xsl:value-of select="replace($passed-string, '&amp;', '\\ampersand')"/> 
</xsl:function> 

Ayrıca bunu çağırdığınızda bu kadar işlevine çağrı gerekir o konumlandırılmış ve böylece, mevcut şablon, publisher eşleşen unutmayın şunun gibi görün ...

<xsl:template match="publisher"> 
    <xsl:value-of select="foo:ampersand-replace(.)"/> 
</xsl:template>