Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT1.0使用包含外部参数节点集_Xml_Xslt_Xslt 1.0_Msxsl - Fatal编程技术网

Xml XSLT1.0使用包含外部参数节点集

Xml 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

我试图将特定节点(EN_PLAN_NAME)中的文本与字符串列表进行比较,以便仅输出包含与其中一个字符串匹配的文本的节点。我试着使用这个类似问题的答案:

输入XML


健康储蓄账户
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
为了达到预期的效果