我正在尝试使用XSLT组合2个兄弟节点值。我已经有一个已经组合了相同节点的XSLT表,但是我无法弄清楚如何组合2个兄弟节点而不会搞乱已经存在的问题。
XML
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:fm="http://www.filemaker.com/fmpdsoresult">
<ROW xmlns="http://www.filemaker.com/fmpdsoresult">
<Sign_Type>BB-1</Sign_Type>
<fm:Floor xmlns="">1</fm:Floor>
<fm:Location xmlns="">2</fm:Location>
<Line1>ELEVATOR MACHINE ROOM 107</Line1>
</ROW>
<ROW xmlns="http://www.filemaker.com/fmpdsoresult">
<Sign_Type>BB-1</Sign_Type>
<fm:Floor xmlns="">1</fm:Floor>
<fm:Location xmlns="">3</fm:Location>
<Line1>ELEVATOR MACHINE ROOM 107</Line1>
</ROW>
<ROW xmlns="http://www.filemaker.com/fmpdsoresult">
<Sign_Type>BB-1</Sign_Type>
<fm:Floor xmlns="">1</fm:Floor>
<fm:Location xmlns="">4</fm:Location>
<Line1>ELEVATOR MACHINE ROOM 107</Line1>
</ROW>
<ROW xmlns="http://www.filemaker.com/fmpdsoresult">
<Sign_Type>BB-1</Sign_Type>
<fm:Floor xmlns="">1</fm:Floor>
<fm:Location xmlns="">5</fm:Location>
<Line1>ELEVATOR MACHINE ROOM 107</Line1>
</ROW>
</root>
XSL
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fm="http://www.filemaker.com/fmpdsoresult">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="artTypeNames" match="fm:ROW" use="concat(fm:Sign_Type, '||', fm:Line1)"/>
<xsl:template match="fm:FMPDSORESULT">
<ROOT>
<xsl:apply-templates select="fm:ROW[count(. | key('artTypeNames', concat(fm:Sign_Type, '||', fm:Line1))[1]) = 1]">
<xsl:sort select="fm:Sign_Type" />
</xsl:apply-templates>
</ROOT>
</xsl:template>
<xsl:template match="fm:ROW">
<xsl:copy>
<xsl:apply-templates select="fm:Sign_Type" />
<fm:Location>
<xsl:apply-templates select="key('artTypeNames', concat(fm:Sign_Type, '||', fm:Line1))/fm:Location" />
</fm:Location>
<xsl:apply-templates select="fm:Line1" />
</xsl:copy>
</xsl:template>
<xsl:template match="fm:Location">
<xsl:if test="position() > 1">, </xsl:if>
<xsl:value-of select="." />
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
输出应该是什么样的:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:fm="http://www.filemaker.com/fmpdsoresult">
<ROW xmlns="http://www.filemaker.com/fmpdsoresult">
<Sign_Type>BB-1</Sign_Type>
<fm:Location xmlns="">1-2, 1-3, 1-4, 1-5</fm:Location>
<Line1>ELEVATOR MACHINE ROOM 107</Line1>
</ROW>
</root>
任何人都可以帮我确定我需要更改的位置和内容才能使其正常工作? 谢谢!
答案 0 :(得分:1)
也许这只是代码中的拼写错误,但是您的第一个模板与XML示例中不存在的 FMPDSORESULT 元素匹配!
<xsl:template match="fm:FMPDSORESULT">
由于这与任何内容都不匹配,内置模板适用,他们最终将使用与 fm:ROW 匹配的模板,用于四个 ROW 中的每一个XML中的元素。
您应该匹配 root 元素
<xsl:template match="root">
至于组合兄弟姐妹,我想你是说你希望输出 Floor 元素以及 Location 元素。例如,你可以在这里使用前面的兄弟。
<xsl:value-of select="preceding-sibling::fm:Floor[1]" />
或者,这种语法也可以使用;只获取当前父
的唯一 Floor 元素<xsl:value-of select="../fm:Floor" />
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fm="http://www.filemaker.com/fmpdsoresult">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="artTypeNames" match="fm:ROW" use="concat(fm:Sign_Type, '||', fm:Line1)"/>
<xsl:template match="root">
<ROOT>
<xsl:apply-templates select="fm:ROW[count(. | key('artTypeNames', concat(fm:Sign_Type, '||', fm:Line1))[1]) = 1]">
<xsl:sort select="fm:Sign_Type" />
</xsl:apply-templates>
</ROOT>
</xsl:template>
<xsl:template match="fm:ROW">
<xsl:copy>
<xsl:apply-templates select="fm:Sign_Type" />
<fm:Location>
<xsl:apply-templates select="key('artTypeNames', concat(fm:Sign_Type, '||', fm:Line1))/fm:Location" />
</fm:Location>
<xsl:apply-templates select="fm:Line1" />
</xsl:copy>
</xsl:template>
<xsl:template match="fm:Location">
<xsl:if test="position() > 1">, </xsl:if>
<xsl:value-of select="../fm:Floor" />
<xsl:text>-</xsl:text>
<xsl:value-of select="." />
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>