使用XSLT对XML属性进行分组

时间:2017-09-26 07:25:27

标签: xml xslt

输入XML:

<?xml version="1.0" encoding="UTF-8"?><svg height="3553.21" width="9358.09" viewBox="0 0 9358.09 3553.21" xmlns="http://www.w3.org/2000/svg">
<rect fill="#16202c" x="0" y="0" width="9358.09" height="3553.21"/>
	<g transform="scale(0.7)>
		<g id="0-0-0" class="classPolyline" type="twycenterline" nameObject="WW12" sizeMin="" sizeMax="">
			<polyline fill="none" stroke="#292929" stroke-width="0.2" fill-opacity="1" points="218.36444444444453,127.61111111111109 "/>
		</g>
		<g id="1-0-0" class="classPolyline" type="twycenterline" nameObject="WW12" sizeMin="" sizeMax="">
			<polyline fill="none" stroke="#292929" stroke-width="0.2" fill-opacity="1" points="462.22222222222223,127.14222222222219 "/>
		</g>
		<g id="2-0-0" class="classPolyline" type="twy" nameObject="WW12" sizeMin="" sizeMax="">
			<polyline fill="none" stroke="#292929" stroke-width="0.2" fill-opacity="1" points="462.22222222222223,127.14222222222219 "/>
		</g>
		<g id="3-0-0" class="classPolyline" type="circle" nameObject="WW12" sizeMin="" sizeMax="">
			<text class="classText" id="12200-0-0" type="lamp_label_only" fill="#ffffff">20L-AP2-065A</text>
		</g>
		<g id="4-0-0" class="classPolyline" type="circle" nameObject="WW12" sizeMin="" sizeMax="">
			<text class="classText" id="12201-0-0" type="lamp_label_only" fill="#ffffff">WW8c-008B</text>
		</g>
	</g>
</svg>

预期产出:

<?xml version="1.0" encoding="UTF-8"?><svg height="3553.21" width="9358.09" viewBox="0 0 9358.09 3553.21" xmlns="http://www.w3.org/2000/svg">
<rect fill="#16202c" x="0" y="0" width="9358.09" height="3553.21"/>
<g transform="scale(0.7)>
	<g type="twycenterline">
		<g id="0-0-0" class="classPolyline" type="twycenterline" nameObject="WW12" sizeMin="" sizeMax="">
			<polyline fill="none" stroke="#292929" stroke-width="0.2" fill-opacity="1" points="218.36444444444453,127.61111111111109 "/>
		</g>
		<g id="1-0-0" class="classPolyline" type="twycenterline" nameObject="WW12" sizeMin="" sizeMax="">
			<polyline fill="none" stroke="#292929" stroke-width="0.2" fill-opacity="1" points="462.22222222222223,127.14222222222219 "/>
		</g>
	</g>
	<g type="twy">
		<g id="2-0-0" class="classPolyline" type="twy" nameObject="WW12" sizeMin="" sizeMax="">
			<polyline fill="none" stroke="#292929" stroke-width="0.2" fill-opacity="1" points="462.22222222222223,127.14222222222219 "/>
		</g>
	</g>
	<g type="circle">
		<g id="3-0-0" class="classPolyline" type="circle" nameObject="WW12" sizeMin="" sizeMax="">
			<text class="classText" id="12200-0-0" type="lamp_label_only" fill="#ffffff">20L-AP2-065A</text>
		</g>
		<g id="4-0-0" class="classPolyline" type="circle" nameObject="WW12" sizeMin="" sizeMax="">
			<text class="classText" id="12201-0-0" type="lamp_label_only" fill="#ffffff">WW8c-008B</text>
		</g>
	</g>
</g>
</svg>

我已经处理过的我的XSLT文件。不确定这个

出了什么问题
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output indent="yes" method="xml" />

    <xsl:key name="type1" match="g" use="@type" />

    <xsl:template match="/">
        <svg  xmlns="http://www.w3.org/2000/svg" >
            <xsl:variable name="viewWidth"><xsl:value-of select=".//@width"/></xsl:variable>
            <xsl:variable name="viewHeight"><xsl:value-of select=".//@height"/></xsl:variable>

            <xsl:attribute name="height"><xsl:value-of select="$viewHeight" /></xsl:attribute>
            <xsl:attribute name="width"><xsl:value-of select="$viewWidth" /></xsl:attribute>

            <g>
                <xsl:variable name="trans"><xsl:value-of select=".//@transform"/></xsl:variable>
                <xsl:attribute name="transform"><xsl:value-of select="$trans" /></xsl:attribute>

                <xsl:variable name="type"><xsl:value-of select=".//@type"/></xsl:variable>

                <xsl:comment>trans <xsl:copy-of select="$trans" /></xsl:comment>
                <xsl:comment>type <xsl:copy-of select="$type" /></xsl:comment>


                <xsl:apply-templates select="g[generate-id(.)=generate-id(key('type1',@type)[1])]"/>
            </g>
        </svg>
    </xsl:template>

    <xsl:template match="g">
        <xsl:comment>template <xsl:copy-of select="template" /></xsl:comment>
        <g value="{@type}">
            <xsl:comment>g1111 <xsl:copy-of select="g11111" /></xsl:comment>
            <xsl:for-each select="key('type1', @type)">
                <xsl:comment><xsl:copy-of select="@type" /></xsl:comment>

            </xsl:for-each>
        </g>

    </xsl:template>


</xsl:stylesheet>

我已经阅读过很多关于此的博客但不是我无法创建群组。以下是详细信息。 输入需要转换为预期输出的XML。下面我分享了输入和输出XMl和我的XSLT文件。 请帮助....

1 个答案:

答案 0 :(得分:1)

您的XSLT有两个问题

  1. 您的初始模板与文档节点“/”匹配。但是,当您执行<Route path="/compA" component={(props) => (<compA {...props} myProp={this.state.myProp} />) } /> 时,选择“g”,它不是文档节点的子节点(“svg”是文档节点的子节点)。要解决此问题,您可以将模板匹配更改为“/ *”。

  2. 您尚未考虑XSLT中的命名空间。 XML中的所有元素都在“http://www.w3.org/2000/svg”命名空间中,但在XSLT中,您正在查找无命名空间中的元素。要解决这个问题,您需要在XSLT中声明命名空间(带前缀),然后在匹配任何元素时使用该前缀。

  3. 如果您在XSLT中使用身份模板,也可以帮助复制现有元素,因为这将有助于简化您的XSLT。

    试试这个XSLT

    xsl:apply-templates