Xml XSLT1.0使用包含外部参数节点集
我试图将特定节点(EN_PLAN_NAME)中的文本与字符串列表进行比较,以便仅输出包含与其中一个字符串匹配的文本的节点。我试着使用这个类似问题的答案: 输入XMLXml XSLT1.0使用包含外部参数节点集,xml,xslt,xslt-1.0,msxsl,Xml,Xslt,Xslt 1.0,Msxsl,我试图将特定节点(EN_PLAN_NAME)中的文本与字符串列表进行比较,以便仅输出包含与其中一个字符串匹配的文本的节点。我试着使用这个类似问题的答案: 输入XML 健康储蓄账户 01012017 健康补偿安排 01012017 健康补偿安排233 01012017 HRA 01012017 基础HRA 01012017 FSA 01012017 预期输出XML 健康补偿安排 01012017 健康补偿安排233 01012017 HRA 01012017 基础HRA 01012017
健康储蓄账户
01012017
健康补偿安排
01012017
健康补偿安排233
01012017
HRA
01012017
基础HRA
01012017
FSA
01012017
预期输出XML
健康补偿安排
01012017
健康补偿安排233
01012017
HRA
01012017
基础HRA
01012017
XSLT
健康补偿安排
HRA
XSLT输出任何文本包含“健康报销安排”但不输出任何包含“HRA”的节点的EN_计划名称。我不确定我做错了什么。注意:您可以从两个示例中提取translate()
。在编辑之前,我已从您的问题中复制了输入
我现在无法测试msxsl,但请尝试以下方法:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var"
exclude-result-prefixes="msxsl var s0 ns0" version="1.0"
xmlns:s0="CDHC_Eligibility_LSDD"
xmlns:ns0="CDHC_Eligibility_LSDD_Internal">
<xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
<xsl:param name="HRAPlanNames">
<PlanName>HEALTH REIMBURSEMENT ARRANGEMENT</PlanName>
<PlanName>HRA</PlanName>
</xsl:param>
<xsl:variable name="lowercase">abcdefghijklmnopqrstuvwxyz</xsl:variable>
<xsl:variable name="uppercase">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
<xsl:template match="/*">
<xsl:copy>
<xsl:for-each select="Eligibility_Detail_Record">
<xsl:variable name="pn" select="translate(EN_PLAN_NAME,$lowercase,$uppercase)"/>
<xsl:if test="msxsl:node-set($HRAPlanNames)/*[contains($pn,normalize-space())]">
<Eligibility_Detail_Record>
<xsl:copy-of select="EN_PLAN_NAME"/>
</Eligibility_Detail_Record>
</xsl:if>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
注意:您可以从两个示例中选择translate()
。在编辑之前,我已从您的问题中复制了输入
我现在无法测试msxsl,但请尝试以下方法:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var"
exclude-result-prefixes="msxsl var s0 ns0" version="1.0"
xmlns:s0="CDHC_Eligibility_LSDD"
xmlns:ns0="CDHC_Eligibility_LSDD_Internal">
<xsl:output omit-xml-declaration="yes" method="xml" version="1.0" />
<xsl:param name="HRAPlanNames">
<PlanName>HEALTH REIMBURSEMENT ARRANGEMENT</PlanName>
<PlanName>HRA</PlanName>
</xsl:param>
<xsl:variable name="lowercase">abcdefghijklmnopqrstuvwxyz</xsl:variable>
<xsl:variable name="uppercase">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
<xsl:template match="/*">
<xsl:copy>
<xsl:for-each select="Eligibility_Detail_Record">
<xsl:variable name="pn" select="translate(EN_PLAN_NAME,$lowercase,$uppercase)"/>
<xsl:if test="msxsl:node-set($HRAPlanNames)/*[contains($pn,normalize-space())]">
<Eligibility_Detail_Record>
<xsl:copy-of select="EN_PLAN_NAME"/>
</Eligibility_Detail_Record>
</xsl:if>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
contains()
函数的两个参数的类型都必须是字符串。您试图将它与节点集一起用作第二个参数,并且(在XSLT1.0中)这将导致只考虑节点集中的第一个节点
如果要保留HRAPlanNames
参数的当前结构,需要执行以下操作:
XSLT1.0
<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="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="HRAPlanNames">
<PlanName>Health Reimbursement Arrangement</PlanName>
<PlanName>HRA</PlanName>
</xsl:param>
<xsl:template match="/*">
<EligibilityRecords xmlns="CDHC_Eligibility_LSDD_Internal">
<xsl:for-each select="Eligibility_Detail_Record">
<xsl:variable name="plan-name" select="EN_PLAN_NAME" />
<xsl:variable name="test">
<xsl:for-each select="msxsl:node-set($HRAPlanNames)/PlanName">
<xsl:if test="contains($plan-name, .)">Y</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:if test="string($test)">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</EligibilityRecords>
</xsl:template>
</xsl:stylesheet>
健康补偿安排
HRA
Y
为了获得预期的结果。函数的
contains()
的两个参数的类型都必须是字符串。您试图将它与节点集一起用作第二个参数,并且(在XSLT1.0中)这将导致只考虑节点集中的第一个节点
如果要保留HRAPlanNames
参数的当前结构,需要执行以下操作:
XSLT1.0
<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="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="HRAPlanNames">
<PlanName>Health Reimbursement Arrangement</PlanName>
<PlanName>HRA</PlanName>
</xsl:param>
<xsl:template match="/*">
<EligibilityRecords xmlns="CDHC_Eligibility_LSDD_Internal">
<xsl:for-each select="Eligibility_Detail_Record">
<xsl:variable name="plan-name" select="EN_PLAN_NAME" />
<xsl:variable name="test">
<xsl:for-each select="msxsl:node-set($HRAPlanNames)/PlanName">
<xsl:if test="contains($plan-name, .)">Y</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:if test="string($test)">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</EligibilityRecords>
</xsl:template>
</xsl:stylesheet>
健康补偿安排
HRA
Y
为了达到预期的效果