这是输入xml。
<catalog>
<product>
<product_id>1234</product_id>
<categories>
<category>
<category_id>frame-shape_oval</category_id>
<category_name>frame-shape_oval</category_name>
</category>
<category>
<category_id>frame-shape_square</category_id>
<category_name>frame-shape_square</category_name>
</category>
<category>
<category_id>frame-color_tortoise</category_id>
<category_name>frame-color_tortoise</category_name>
</category>
<category>
<category_id>face-shape_oval</category_id>
<category_name>face-shape_oval</category_name>
</category>
<category>
<category_id>face-shape_square</category_id>
<category_name>face-shape_square</category_name>
</category>
<category>
<category_id>gender_men</category_id>
<category_name>gender_men</category_name>
</category>
<category>
<category_id>lens-color_gold rose</category_id>
<category_name>lens-color_gold rose</category_name>
</category>
<category>
<category_id>fit_average</category_id>
<category_name>fit_average</category_name>
</category>
</categories>
</product>
</catalog>
这是预期的转变
<catalog>
<product>
<product_id>1234</product_id>
<frame_shape>oval,square</frame_shape>
<frame_color>tortoise</frame_color>
<face_shape>oval,square</face_shape>
<gender>men</gender>
<lens_color>gold rose</lens_color>
<fit>average</fit>
</product>
</catalog>
这可以通过xslt转换实现吗?
<category_id>frame-shape_oval</category_id>
变为<frame_shape>oval</frame_shape>
。因此,下划线之前的文本将成为元素名称和下划线成为元素值之后的文本。<category_id>
重复使用<product>
框架形状和框架颜色,但<category_name>
中的值不同。这些值与逗号连接。答案 0 :(得分:0)
第一个问题相当简单,可以通过以下方式解决:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="category">
<xsl:element name="{substring-before(category_id, '_')}">
<xsl:value-of select="substring-after(category_id, '_')"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
请注意,这假设category_id
中下划线之前的子字符串始终是有效的XML元素名称。
关于第二个问题,请参阅http://www.jenitennison.com/xslt/grouping/muenchian.html以及很多很多关于Muenchian分组的例子。
答案 1 :(得分:-1)
您可以尝试以下解决方案。请注意我已经使用microsoft的node-set()将“temp”变量的内容转换为节点集。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl">
<xsl:template match="/*">
<catalog>
<xsl:for-each select="product">
<product>
<xsl:copy-of select="product_id"/>
<xsl:variable name="temp">
<xsl:for-each select="categories/category//category_id">
<xsl:element name="{substring-before(.,'_')}">
<xsl:value-of select="substring-after(.,'_')"/>
</xsl:element>
</xsl:for-each>
</xsl:variable>
<xsl:for-each select="msxsl:node-set($temp)/*">
<xsl:variable name="curName" select="local-name(.)"/>
<xsl:choose>
<xsl:when test="(count(following-sibling::*[local-name()=$curName]) > 0) and (count(preceding-sibling::*[local-name()=$curName]) = 0)">
<xsl:element name="{$curName}">
<xsl:value-of select="."/>
<xsl:for-each select="following-sibling::*[local-name()=$curName]">
,<xsl:value-of select="."/>
</xsl:for-each>
</xsl:element>
</xsl:when>
<xsl:when test="(count(following-sibling::*[local-name()=$curName]) = 0) and (count(preceding-sibling::*[local-name()=$curName]) = 0)">
<xsl:element name="{$curName}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</product>
</xsl:for-each>
</catalog>
</xsl:template>
</xsl:stylesheet>