无法从多元素xslt

时间:2015-10-13 08:45:52

标签: php xml xslt-1.0

我在这里尝试的是,我想将标记<beschreibung>...</beschreibung>中的所有值与标记<rissko>...</risiko>

中的相同ID放在一起

我面临的问题是,我必须在xslt-1.0中使用正确的输出格式确定变量,现在我可以从具有相同<risiko/>的每个元素中获取第一个值

输入的XML:

 <damages>
    <Element name="0">
        <risiko>/db/so/si/GebaeudeSchadenWasser.xml</risiko>
        <schaden>200</schaden>
        <beschreibung>wasser</beschreibung>
    </Element>
    <Element name="1">
        <risiko>/db/so/si/GebaeudeSchadenFeuer.xml</risiko>
        <schaden>200</schaden>
        <beschreibung>feuer 1</beschreibung>
    </Element>
    <Element name="2">
        <risiko>/db/so/si/GebaeudeSchadenElementar.xml</risiko>
        <schaden>200</schaden>
        <beschreibung>elementar 2</beschreibung>
    </Element>
    <Element name="3">
        <risiko>/db/so/si/GebaeudeSchadenElementar.xml</risiko>
        <schaden>200</schaden>
        <beschreibung>elementar 3</beschreibung>
    </Element>
    <Element name="4">
        <risiko>/db/so/si/GebaeudeSchadenElementar.xml</risiko>
        <schaden>200</schaden>
        <beschreibung>elementar 1</beschreibung>
    </Element>
    <Element name="5">
        <risiko>/db/so/si/GebaeudeSchadenGlas.xml</risiko>
        <schaden>200</schaden>
        <beschreibung>glas</beschreibung>
    </Element>
    <Element name="6">
        <risiko>/db/so/si/GebaeudeSchadenFeuer.xml</risiko>
        <schaden>200</schaden>
        <beschreibung>feuer 2</beschreibung>
    </Element>
    <Element name="7">
        <risiko>/db/so/si/GebaeudeSchadenSturm.xml</risiko>
        <schaden>300</schaden>
        <beschreibung>sturm</beschreibung>
    </Element>
</damages>

XSL变量:

<xsl:variable name="damage">
<damage>
    <xsl:if test="$iVorschadenFeuer">
        <R>
            <riskid>
                <xsl:value-of select="'/db/so/si/GebaeudeSchadenFeuer.xml'" />
            </riskid>
            <id>
                <xsl:value-of select="'1'" />
            </id>
            <gefahrbasis>
                <xsl:value-of select="'F'" />
            </gefahrbasis>
        </R>
    </xsl:if>
    <xsl:if test="$iVorschadenWasser">
    ...
</xsl:if>
    <xsl:if test="$iVorschadenSturm">
    ...
</xsl:if>
</damage>

具有输出结构的模板:

     <xsl:template match="R">
            <xsl:variable name="aktrisk" select="riskid" />
            <xsl:variable name="aktid" select="id" />
            <sach:Vorschaden>
                <vs-pm:AnzahlVorschaeden>
                    <xsl:value-of select="count($iDamages[risiko = $aktrisk])" />
                </vs-pm:AnzahlVorschaeden>
                <vs-pm:Beschreibung>
              <xsl:choose>
               <xsl:when test="$iDamages[risiko = $aktrisk]/beschreibung != ''">
                 <xsl:for-each select="$iDamages[risiko = $aktrisk]">
                            <xsl:value-of select="$iDamages[risiko = $aktrisk]/beschreibung" />
                            <xsl:value-of select="'/ '" />
                 </xsl:for-each>
   </xsl:when>
           <xsl:otherwise>
                <xsl:value-of select="'Keine Angaben'" />
           </xsl:otherwise>
          </xsl:choose>
        </vs-pm:Beschreibung>
        <vs-pm:DeckungID xsi:type="dt:STE_DeckungBasis">
            <xsl:value-of select="$aktid" />
        </vs-pm:DeckungID>
        <xsl:if test="gefahrbasis">
            <vs-pm:Gefahr xsi:type="dt:STE_GefahrBasis">
            <xsl:value-of select="gefahrbasis" />
            </vs-pm:Gefahr>
        </xsl:if>
        <vs-pm:Schadenhoehe>
            <allg:Betrag>
                <xsl:value-of select="sum($iDamages[risiko = $aktrisk]/schaden)" />
            </allg:Betrag>
            <allg:Waehrung>
                <xsl:value-of select="'EUR'" />
            </allg:Waehrung>
        </vs-pm:Schadenhoehe>
    </sach:Vorschaden>

这里的问题是$iDamages[risiko = $aktrisk]/beschreibung我刚刚获得elementar 2 3次,但我想让它像elementar 2/ elementar 3/ elementar 1(订单无关紧要)

答案:

<sach:Vorschaden>
    <vs-pm:AnzahlVorschaeden>3</vs-pm:AnzahlVorschaeden>
    <vs-pm:Beschreibung>elementar 1/ elementar 2/ elementar 3</vs-pm:Beschreibung>
    <vs-pm:DeckungID xsi:type="dt:STE_DeckungBasis">1</vs-pm:DeckungID>
    <vs-pm:Gefahr xsi:type="dt:STE_GefahrBasis">F</vs-pm:Gefahr>
    <vs-pm:Schadenhoehe>
     <allg:Betrag>300</allg:Betrag>
     <allg:Waehrung>EUR</allg:Waehrung>
    </vs-pm:Schadenhoehe>
</sach:Vorschaden>

我宁愿不使用muenchian分组

1 个答案:

答案 0 :(得分:1)

我找到了一种生成正确输出的方法

我必须在变量<text>...</text>

中添加其他标记$damage

现在看起来像是:

<xsl:variable name="damage">
    <damage>
        <xsl:if test="$iVorschadenFeuer">
            <R>
                <riskid>
                    <xsl:value-of select="'/db/so/si/GebaeudeSchadenFeuer.xml'" />
                </riskid>
                <id>
                    <xsl:value-of select="'1401'" />
                </id>
                <gefahrbasis>
                    <xsl:value-of select="'F'" />
                </gefahrbasis>
                <text>
                    <xsl:for-each select="$iVorschadenFeuer">
                        <xsl:value-of select="beschreibung" />
                        <xsl:if test="position() != last()">
                         <xsl:value-of select="', '" />
                        </xsl:if>
                    </xsl:for-each>
                </text>
            </R>
        </xsl:if>

所以我只需要获取节点文本的值