Nasıl PHP XSLT bir parametre olarak tek hem de çift tırnak içeren bir dize geçmek için?

3 Cevap php

Ben böyle basit bir PHP tabanlı XSLT trasform kodu vardır:

$xsl = new XSLTProcessor();
$xsl->registerPHPFunctions();
$xsl->setParameter("","searchterms", $searchterms);
$xsl->importStylesheet($xslDoc);
echo $xsl->transformToXML($doc);

Kod dönüşlerde bir metin olarak kullanır XSLT stil sayfası için bir parametre olarak bir dize içeren değişken $ Aramak istediğiniz, geçer:

<title>search feed for <xsl:value-of select="$searchterms"/></title> 

Bunu karışımları ile bir dize geçmek için çalışacağız kadar bu çalışıyor, ki:

$searchterms = '"some"'." text's quotes are mixed."

Bu noktada XSLT işlemci bağırır:

Cannot create XPath expression (string contains both quote and double-quotes)

Güvenle XSLT giriş olarak keyfi dizeleri geçmek için doğru yolu nedir? Bu dizeleri sonuç XML bir metin değeri olarak değil, bir XPATH paramatresi olarak kullanılacak unutmayın.

Thanks, Boaz

3 Cevap

son çıkışı HTML ise bunu htmlencoding deneyebilirsiniz. Sürece kişiler biçembette ayarlanmış olarak Tamam olmalıdır

Sen &apos; tek tırnak kaçmak için kullanabilirsiniz:

$searchterms = '"some" text&apos;s quotes are mixed.'

Bu bir hata olarak kaydedilir edilmiştir:

https://bugs.php.net/bug.php?id=64137

Bu yorumu:

Bu eksiklik XPath 1.0 karakterleri kaçmak için bir mekanizma sağlamaz, bu yüzden PHP tırnak her iki türlerini içeren bir dize ifade etmek için basit bir yol yok olmasından kaynaklanır. XPath 1.0, ancak, dizeleri bitiştirmek için bir işlevi sağlamaz. Concat () kullanarak, iki karakterden oluşan bir dize "'('," '") concat olarak ifade edilebilir'". concat () 2 veya daha fazla argüman alır.

Aşağıdaki iş çevresinde içerir:

Yani sürece alıntı stili alternatif olarak, hem türleri tırnak herhangi bir sayı içeren bir dize ifade edebilir.

Başka bir çözüm, tek tırnak ile tüm düz tırnaklarla değiştirmek için:

$t = str_replace( "\"", "''", $t );
$xsltEngine->setParameter( "some-text", $t );