我的要求是将以下源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>
),并在复制的文本之间附加定界符。
答案 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
答案 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>
请检查此代码。