Xml XSLT删除重复项
我有一个xml数据源,如下所示:Xml XSLT删除重复项,xml,xslt,Xml,Xslt,我有一个xml数据源,如下所示: <dsQueryResponse> <Department> <Rows> <Row dept="HR" state="NY" region="East"/> <Row dept="HR" state="NJ" region="East"/> <Row dept="SD" state="NY" region="East"/> <
<dsQueryResponse>
<Department>
<Rows>
<Row dept="HR" state="NY" region="East"/>
<Row dept="HR" state="NJ" region="East"/>
<Row dept="SD" state="NY" region="East"/>
<Row dept="MM" state="NY" region="East"/>
<Row dept="SD" state="NJ" region="East"/>
<Row dept="SD" state="CO" region="West"/>
<Row dept="MM" state="CO" region="West"/>
</Rows>
</Department>
</dsQueryResponse>
<?xml version="1.0" encoding="utf-8"?>
<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:output method="html" indent="no"/>
<xsl:decimal-format NaN=""/>
<xsl:param name="DeptQS">East</xsl:param>
<xsl:variable name="deptRows" select="/dsQueryResponse/Department/Rows/Row[@region = $DeptQS]"/>
<xsl:template match="/">
<xsl:if test="count($deptRows) > 0">
<xsl:call-template name="deptList"/>
</xsl:if>
</xsl:template>
<xsl:template name="deptList">
<xsl:for-each select="$deptRows">
<!-- process unique depts-->
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
<xsl:template match="Rows">
<xsl:for-each-group select="Row" group-by="@region">
<region name="{current-grouping-key()}">
<xsl:for-each-group select="current-group()" group-by="@dept">
<dept name="{current-grouping-key()}">
<xsl:for-each select="current-group()">
<state name="{@state}"/>
</xsl:for-each>
</dept>
</xsl:for-each-group>
</region>
</xsl:for-each>
</xsl:template>
我的XSLT如下所示:
<dsQueryResponse>
<Department>
<Rows>
<Row dept="HR" state="NY" region="East"/>
<Row dept="HR" state="NJ" region="East"/>
<Row dept="SD" state="NY" region="East"/>
<Row dept="MM" state="NY" region="East"/>
<Row dept="SD" state="NJ" region="East"/>
<Row dept="SD" state="CO" region="West"/>
<Row dept="MM" state="CO" region="West"/>
</Rows>
</Department>
</dsQueryResponse>
<?xml version="1.0" encoding="utf-8"?>
<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:output method="html" indent="no"/>
<xsl:decimal-format NaN=""/>
<xsl:param name="DeptQS">East</xsl:param>
<xsl:variable name="deptRows" select="/dsQueryResponse/Department/Rows/Row[@region = $DeptQS]"/>
<xsl:template match="/">
<xsl:if test="count($deptRows) > 0">
<xsl:call-template name="deptList"/>
</xsl:if>
</xsl:template>
<xsl:template name="deptList">
<xsl:for-each select="$deptRows">
<!-- process unique depts-->
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
<xsl:template match="Rows">
<xsl:for-each-group select="Row" group-by="@region">
<region name="{current-grouping-key()}">
<xsl:for-each-group select="current-group()" group-by="@dept">
<dept name="{current-grouping-key()}">
<xsl:for-each select="current-group()">
<state name="{@state}"/>
</xsl:for-each>
</dept>
</xsl:for-each-group>
</region>
</xsl:for-each>
</xsl:template>
东边
我想把这个地区所有的部门都写出来。我现在的代码将写出重复的部门。但我怎么能只写一次该地区的部门
谢谢 对于XSLT1.0,可以使用“” 您可以创建一个键,通过组合
@region
和@dept
值来索引行
元素
然后,您将获得该区域/部门组合的第一个匹配项(具有所需区域(DeptQS
)并输出该部门(dept
)
下面是一个输出
元素以显示上下文的示例样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kDept" match="Department/Rows/Row" use="concat(@region,'|',@dept)"/>
<xsl:param name="DeptQS">East</xsl:param>
<xsl:template match="/*">
<xsl:for-each select="Department/Rows/Row[count(.|key('kDept',
concat($DeptQS,'|',@dept))[1])=1]">
<test>Current dept: <xsl:value-of select="@dept"/></test>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
东边
现任部门:
以下是使用输入XML的输出:
<test>Current dept: HR</test>
<test>Current dept: SD</test>
<test>Current dept: MM</test>
当前部门:人力资源部
现任部门:SD
现任部门:MM
您尚未显示所需的输出。但在XSLT 2.0中,您可以执行以下操作:
<dsQueryResponse>
<Department>
<Rows>
<Row dept="HR" state="NY" region="East"/>
<Row dept="HR" state="NJ" region="East"/>
<Row dept="SD" state="NY" region="East"/>
<Row dept="MM" state="NY" region="East"/>
<Row dept="SD" state="NJ" region="East"/>
<Row dept="SD" state="CO" region="West"/>
<Row dept="MM" state="CO" region="West"/>
</Rows>
</Department>
</dsQueryResponse>
<?xml version="1.0" encoding="utf-8"?>
<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:output method="html" indent="no"/>
<xsl:decimal-format NaN=""/>
<xsl:param name="DeptQS">East</xsl:param>
<xsl:variable name="deptRows" select="/dsQueryResponse/Department/Rows/Row[@region = $DeptQS]"/>
<xsl:template match="/">
<xsl:if test="count($deptRows) > 0">
<xsl:call-template name="deptList"/>
</xsl:if>
</xsl:template>
<xsl:template name="deptList">
<xsl:for-each select="$deptRows">
<!-- process unique depts-->
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
<xsl:template match="Rows">
<xsl:for-each-group select="Row" group-by="@region">
<region name="{current-grouping-key()}">
<xsl:for-each-group select="current-group()" group-by="@dept">
<dept name="{current-grouping-key()}">
<xsl:for-each select="current-group()">
<state name="{@state}"/>
</xsl:for-each>
</dept>
</xsl:for-each-group>
</region>
</xsl:for-each>
</xsl:template>
我怎样才能写出你的部门
该地区只有一次
此样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="pRegion" select="'East'"/>
<xsl:key name="kRowByDept-Region" match="Row"
use="concat(@dept,'++',@region)"/>
<xsl:template match="Rows">
<xsl:apply-templates select="Row[generate-id()
= generate-id(
key('kRowByDept-Region',
concat(@dept,'++',$pRegion)
)[1]
)
]"/>
</xsl:template>
<xsl:template match="Row">
<xsl:value-of select="concat(@dept,'
')"/>
</xsl:template>
</xsl:stylesheet>
以下样式表显示了在多个级别进行分组的一般方法:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="byRegion" match="Row" use="@region" />
<xsl:key name="byRegionState"
match="Row" use="concat(@region, '|', @state)" />
<xsl:key name="byRegionStateDept"
match="Row" use="concat(@region, '|', @state, '|', @dept)" />
<xsl:template
match="Row[generate-id() = generate-id(key('byRegion', @region)[1])]">
<region name="{@region}">
<xsl:apply-templates
select="key('byRegion', @region)
[generate-id() =
generate-id(key('byRegionState',
concat(@region, '|', @state))[1])]"
mode="states" />
</region>
</xsl:template>
<xsl:template match="Row" mode="states">
<state name="{@state}">
<xsl:apply-templates
select="key('byRegionState', concat(@region, '|', @state))
[generate-id() =
generate-id(key('byRegionStateDept',
concat(@region, '|', @state, '|', @dept))[1])]"
mode="dept" />
</state>
</xsl:template>
<xsl:template match="Row" mode="dept">
<dept><xsl:value-of select="@dept" /></dept>
</xsl:template>
</xsl:stylesheet>
它在您的输入上产生以下输出:
<region name="East">
<state name="NY">
<dept>HR</dept>
<dept>SD</dept>
<dept>MM</dept>
</state>
<state name="NJ">
<dept>HR</dept>
<dept>SD</dept>
</state>
</region>
<region name="West">
<state name="CO">
<dept>SD</dept>
<dept>MM</dept>
</state>
</region>
人力资源
SD
嗯
人力资源
SD
SD
嗯
变量/参数引用在XSLT 1.0模式中无效,例如xsl:key/@match
您不能在XSLT 1.0模式中使用var/param引用,但可以在XSLT 2.0中使用。这改变了整个问题,因为在XSLT1.0中必须使用推送样式。您的答案在模式中使用pull样式和param引用。这不是您第一句话所说的XSLT1.0解决方案。西蒙,感谢您对其进行编辑。我使用请提供实际和预期结果。否则,很难准确理解您需要什么。