Как объединить пары узел = значение с & seprator - PullRequest
2 голосов
/ 01 сентября 2011

Мне нужно преобразовать xml-структуру в текстовую строку, используя xslt.У меня есть XML-структура, подобная этой:

<index>
  <account index="0">00000000000</account>
  <customerId index="0">1112xxxxxxx</customerId>
  <authorization>1</authorization>
  <access>1</access>
  <documentGroup>1</documentGroup>
  <documentType>165200</documentType>
  <!-- Any number of child nodes -->
</index>

Мне нужно преобразовать это в пост-параметры, например:

account=00000000000&customerId=1112xxxxxxx&authorization=1.....

Любые идеи о том, как этого добиться?

Ответы [ 3 ]

3 голосов
/ 01 сентября 2011

Обратите внимание, что если вы не ограничены XSLT 1.0, вы можете использовать расширенный XSLT 2.0 xsl:value-of и свести все к одному шаблону:

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

    <xsl:template match="index">
        <xsl:value-of select="*/concat(local-name(),'=',.)" separator="&amp;"/>
    </xsl:template>

</xsl:stylesheet>

Даже в XSLT 1.0 вы можете свести все к одному шаблону, не прибегая к каким-либо инструкциям итерации:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="index/*">
        <xsl:if test="position()>1">
            <xsl:text>&amp;</xsl:text>
        </xsl:if>
        <xsl:value-of select="concat(local-name(), '=', .)"/>
    </xsl:template>

</xsl:stylesheet>
1 голос
/ 01 сентября 2011

Что-то вроде этого должно делать то, что вам нужно. Возможно, вам придется остерегаться кодирования сущности с помощью &amp;, но xsl:output method="text" должен позаботиться об этом:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <xsl:output method="text"/>  
   <xsl:template match="index">
       <xsl:variable name="len" select="count(*)"/>
       <xsl:for-each select="*">
            <xsl:value-of select="name()"/>=<xsl:value-of select="."/><xsl:choose>
                <xsl:when test="position() &lt; $len">&amp;</xsl:when>
            </xsl:choose>
       </xsl:for-each>
   </xsl:template>
</xsl:stylesheet>

Хотя это не «ускользнет» от строк (т.е. преобразует такие вещи, как пробелы в% 20), что может вызвать проблемы, но будет работать для любого количества дочерних узлов, с которыми, я думаю, была основная проблема, с которой вы столкнулись?

0 голосов
/ 01 сентября 2011
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" indent="yes"/>

    <xsl:template match="index">
        <xsl:apply-templates select="*"/>
    </xsl:template>

    <xsl:template match="*">
        <xsl:value-of select="concat(local-name(), '=', .)"/>
        <xsl:if test="following-sibling::*">
            <xsl:text>&amp;</xsl:text>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...