Редактирование строки с помощью анализа строки в XSLT - PullRequest
1 голос
/ 08 марта 2012

Я использую следующую функцию в php для загрузки документа xml в документ xslt, вывода xml и замены document.xml в слове docx:

$xmlDocument = new DOMDocument();
$xmlDocument->load('xml/' . $xmlfile);

$xsltDocument = new DOMDocument();
$xsltDocument->load($xsltFile);

$xsltProcessor = new XSLTProcessor();
$xsltProcessor->importStylesheet($xsltDocument);

Поэтому я обычно использую эту функцию вXSLT-файл для извлечения XML-переменной:

<xsl:value-of select="PORT_REQUEST/WICIS/REMARKS" />

Однако, поскольку XML-переменные загружаются непосредственно в документ XSLT, я не могу использовать свои дружественные PHP-выражения reg, и я изо всех сил пытаюсь выяснить, какчтобы сделать эту работу.Мне просто нужно вытащить XML var (номер телефона в формате 1112223333) и поместить его в формат 111-222-3333.

Вот что у меня есть:

            <xsl:analyze-string select="PORT_REQUEST/NUMBER_PORTABILITY/ADMINISTRATIVE/ATN"
                regex="(^.{3})|(.{4}$)|((?<=(^.{3}))(.*?)(?=(.{4}$)))">

                  <xsl:matching-substring>
                  <xsl:number value="regex-group(1)" format="001"/>
                  <xsl:number value="regex-group(2)" format="001"/>
                  <xsl:number value="regex-group(3)" format="0001"/>
                  </xsl:matching-substring>
                </xsl:analyze-string>

И этоне работает, вместо переформатированного номера телефона я получаю пустой XML-документ, так как любая ошибка, которую я вызываю, убивает все это.Помощь

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

Вы уверены, что имеете доступ к XSLT2? По умолчанию PhP, скорее всего, будет иметь XSLT1, если вы где-нибудь не подключили XSLT2-движок saxon. В этом случае xsl:analyze-string и replace() недоступны, и вы хотите что-то вроде

<xsl:for-each select="PORT_REQUEST/NUMBER_PORTABILITY/ADMINISTRATIVE/ATN">
<xsl:value-of select="substring(.,1,3)"/>
<xsl:text>-</xsl:text>
<xsl:value-of select="substring(.,4,3)"/>
<xsl:text>-</xsl:text>
<xsl:value-of select="substring(.,7)"/>
</xsl:for-each>
1 голос
/ 08 марта 2012

xsl:analyze-string излишне для этой ситуации.Вместо этого при условии, что у вас есть XSLT 2.0, Я бы использовал одну замену регулярного выражения:

<xsl:value-of select="replace(PORT_REQUEST/WICIS/REMARKS,
             '(\d{3})(\d{3})(\d{4})', '$1-$2-$3')" />

Это разбирает любое 10-значное число на блоки 3-3-4 и выводит ихс дефисами между ними.

Однако, как отметил @David Carlisle, XSLT 2.0 обычно не доступен с PHP.Так что ни xsl:analyze-string, ни replace() недоступны.Смотри его ответ.

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