Какой самый последний / самый продвинутый парсер xslt в PHP? - PullRequest
0 голосов
/ 07 февраля 2012

Пробовал XSLTProcessor, но он ломается, если я пытаюсь добавить атрибуты к элементам с потомками

XSLTProcessor :: transformToXml () [xsltprocessor.transformtoxml]: xsl: attribute: не удается добавить атрибуты вэлемент, если потомки уже добавлены к элементу.

Я добавлю, что этот самый XSLT + XML правильно анализируется на стороне клиента.
Есть ли какая-либо версия PHP / анализатор, который знаеткак справиться с такой проблемой?

UPD : Я использую XSL - это третье лицо, к которому мы подключаемся, у меня нет контроля над тем, что я получаю оттуда / из них.

Ответы [ 3 ]

1 голос
/ 07 февраля 2012

Когда вы добавляете атрибуты к элементу после добавления потомков к элементу, процессору XSLT 1.0 разрешается либо игнорировать атрибуты, либо сообщать об ошибке. Кажется, у вас есть два процессора, которые выбрали разные варианты. В любом случае код не работает и нуждается в исправлении. (XSLT 2.0 требует сообщения об ошибке.)

0 голосов
/ 07 февраля 2012

Это также проблема с другими анализаторами (MSXML, .NET System.XML).
Попробуйте перестроить заказ в XSL. Вы должны четко указать, где вы хотите, чтобы ваш элемент.

Вот пример XML / XSL

<xml>
    <e>One</e>
    <e>Two</e>
    <e>Three</e>
</xml>

Вы можете добавить как элементы, так и атрибуты с помощью следующего XSL

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xml>
    <xsl:for-each select='/xml/e'>
        <xsl:element name='e'>
            <xsl:attribute name='newatt'>New attribute</xsl:attribute>
            <xsl:value-of select='.'/>
        </xsl:element>
        <xsl:element name='newlement'>
            <xsl:attribute name='newatt'>New attribute in new element</xsl:attribute>
            new element value
        </xsl:element>
    </xsl:for-each>
</xml>
</xsl:template>
</xsl:stylesheet>

Создает это

   <?xml version="1.0"?>
<xml>
  <e newatt="New attribute">One</e>
  <newlement newatt="New attribute in new element">
                        new element value
                </newlement>
  <e newatt="New attribute">Two</e>
  <newlement newatt="New attribute in new element">
                        new element value
                </newlement>
  <e newatt="New attribute">Three</e>
  <newlement newatt="New attribute in new element">
                        new element value
                </newlement>
</xml>
0 голосов
/ 07 февраля 2012

XSLTProcessor - лучший выбор для PHP. Старайтесь избегать проблемного синтаксиса в шаблонах. если я правильно понимаю вашу задачу, вы можете попробовать что-то вроде этого:

<xsl:template match="XPathOfYourElement">
    <someTag someAttribute='<xsl:value-of select="someXpath"/>'>
        <xsl:apply-templates/>
    </someTag>
</xsl:template>

Также вы можете использовать php4 xslt functions , но это moveton.

Другой способ - использовать не-php консольные утилиты для преобразования xslt через shell_exec (), но это тоже плохой способ.

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