Я не знаком с 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("'",name(),"'",
" => ",
"'",.,"'")'/>
</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("\","'",name(),"\","'",
" => ",
"\","'",.,"\","'")'/>
</xsl:template>
</xsl:stylesheet>
При применении к тому же XML-документу это преобразование создает :
array(\'id\' => \'a\', \'bar\' => \'xzz\')