XSLT: передача всех атрибутов тега в функцию php - PullRequest
4 голосов
/ 06 октября 2011

Я написал следующий шаблон XSLT:

<xsl:template match="foo:*">
    <xsl:processing-instruction name="php">$s = ob_get_clean(); ob_start(); $this->callExtensionStartHandler('<xsl:value-of select="local-name()" />');</xsl:processing-instruction>
    <xsl:apply-templates/>
    <xsl:processing-instruction name="php">$sExtensionContent = ob_get_clean(); ob_start(); echo $s; echo $this->callExtensionEndHandler('<xsl:value-of select="local-name()" />', $sExtensionContent);</xsl:processing-instruction>
</xsl:template>

Теперь я хочу передать все атрибуты и их значения тега в функцию php.Если бы у меня был шаблон:

<foo:test id="a" bar="xzz"/>

Я бы хотел иметь массив ('id' => 'a', 'bar' => 'xzz') в моей функции php.Это возможно.Я не хочу ограничивать имена атрибутов, поэтому может быть любое имя атрибута.

Ответы [ 2 ]

1 голос
/ 07 октября 2011

Я не знаком с PHP, но это может быть полезно:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:foo="foo:foo">
 <xsl:output method="text"/>

 <xsl:template match="foo:test">
  array(<xsl:apply-templates select="@*"/>)
 </xsl:template>

 <xsl:template match="foo:test/@*">
  <xsl:if test="not(position()=1)">, </xsl:if>
  <xsl:value-of select=
  'concat(&quot;&apos;&quot;,name(),&quot;&apos;&quot;,
          " => ",
          &quot;&apos;&quot;,.,&quot;&apos;&quot;)'/>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к этому XML-документу (предоставленный, правильно сформированный):

<foo:test id="a" bar="xzz" xmlns:foo="foo:foo"/>

желаемый, правильный результат выдается :

  array('id' => 'a', 'bar' => 'xzz')

Обновление : В комментарии ОП спросили:

Спасибо, это выглядит великолепно! Можно ли добавить экранирование к значение атрибута? Каждый «должен стать» 1019 *

Ответ : Да, мы можем получить этот вывод, слегка изменив исходное решение:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:foo="foo:foo">
 <xsl:output method="text"/>

 <xsl:template match="foo:test">
  array(<xsl:apply-templates select="@*"/>)
 </xsl:template>

 <xsl:template match="foo:test/@*">
  <xsl:if test="not(position()=1)">, </xsl:if>
  <xsl:value-of select=
  'concat(&quot;\&quot;,&quot;&apos;&quot;,name(),&quot;\&quot;,&quot;&apos;&quot;,
          " => ",
          &quot;\&quot;,&quot;&apos;&quot;,.,&quot;\&quot;,&quot;&apos;&quot;)'/>
 </xsl:template>
</xsl:stylesheet>

При применении к тому же XML-документу это преобразование создает :

  array(\'id\' => \'a\', \'bar\' => \'xzz\')
1 голос
/ 06 октября 2011

Разве вы не можете просто передать сам элемент, а затем получить все атрибуты с помощью соответствующей функции php? Таким образом, вам не нужно заботиться об именах атрибутов, так как я уверен, что есть способ перебрать все атрибуты элемента в php:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...