使用XSLT串联XML节点

时间:2019-02-05 02:03:08

标签: xml xslt

我的要求是将以下源XML转换为目标XML。您能帮我所需的XSLT吗?

源XML:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
    <property><namevalue name="loccode1">BIN01</namevalue></property>
    <property><namevalue name="locdesc1">Description for BIN01</namevalue></property>
    <property><namevalue name="loccode2">BIN02</namevalue></property>
    <property><namevalue name="locdesc2">Description for BIN02</namevalue></property>
    <property><namevalue name="loccode3">BIN03</namevalue></property>
    <property><namevalue name="locdesc3">Description for BIN03</namevalue></property>
</catalog>

目标XML:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
    <property>
        <namevalue name="location1">BIN01#Description for BIN01</namevalue>
    </property>
    <property>
        <namevalue name="location2">BIN02#Description for BIN02</namevalue>
    </property>
    <property>
        <namevalue name="location3">BIN03#Description for BIN03</namevalue>
    </property>
</catalog>

要求是将namevalue个节点的值与属性loccode<seq>locdesc<seq>串联在一起。你能帮我实现这个目标吗?

以下代码段

<xsl:apply-templates select="catalog/property/namevalue[@name='loccode2'] |  catalog/property/namevalue[@name='locdesc2']" />

希望我明确指定属性名称,并且输出为BIN01Description for BIN01(我什至无法添加定界符)。有没有一种方法可以动态传递属性(例如loccode<seq>locdesc<seq>),并在复制的文本之间附加定界符。

3 个答案:

答案 0 :(得分:0)

  

有没有一种动态传递属性的方法(例如loccode或locdesc)

是的。您可以使用:

/catalog/property[starts-with(namevalue/@name, 'loccode')]

仅选择location codes属性。


或者,如果结构遵循常规模式,则可以使用:

/catalog/property[position() mod 2 = 1]

进行相同的选择,然后:

following-sibling::property[1]

选择相邻的location description属性。

答案 1 :(得分:0)

您也可以使用它作为替代:

SCHOOL_NAME STUDENT_NAME CLASS_ID         RNK        CNT         RN
----------- ------------ --------- ---------- ---------- ----------
AMM         Adam         AMM-1-1-1          1          2          1
AMM         joe          AMM-1-1-2          2          2          2
AMM         Albert       AMM-1-2-1          1          2          1
AMM         Nancy        AMM-1-2-2          2          2          2
IRB         Frank        IRB-1-1-1          1          2          1
IRB         Mike         IRB-1-1-2          2          2          2

查看此链接:http://xsltransform.net/3MP2uBK/1

答案 2 :(得分:-1)

    <xsl:template match="catalog">
    <catalog>
        <xsl:apply-templates select="property"/>
    </catalog>
</xsl:template>
<xsl:template match="property/namevalue">
    <xsl:choose>
        <xsl:when test="contains(., 'Description for ')"/>
        <xsl:otherwise>
            <property>
                <namevalue>
                    <xsl:if test="@name">
                        <xsl:attribute name="name">
                            <xsl:value-of select="concat('location', substring-after(@name, 'loccode'))"/>
                        </xsl:attribute>
                        <xsl:value-of select="concat(.,'#','Description for ',.)"/>
                    </xsl:if>
                </namevalue>
            </property>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

请检查此代码。