xsl:每个电话号码都关联到变量

时间:2018-10-10 22:53:42

标签: xml xslt xpath

我刚接触xsl。我需要遍历一些xml元素:“ telecom”,并且如果确实将tel分配给PtPhoneNumber变量,则需要搜索其中是否包含tel。然后,如果其中包含mail,则将其分配给PtEmail。

这是XML:

<recordTarget>
<patientRole>
<telecom use="HP" value="tel:555-555-2004"></telecom>
<telecom use="HP" value="mailto:aaeveryman@email.com"></telecom>

这是我的XPath for循环和if语句:

    <xsl:variable name="Telecom" select="ClinicalDocument/recordTarget/patientRole/telecom/@value"/>
<xsl:for-each select="Telecom">"
    <xsl:if test = "contains(Telecom,'tel')">
        <xsl:variable name="PtPhoneNumber"/>
    </xsl:if>
    <!--<xsl:if test=(fn:contains('mail',''))>
        <xsl:variable name="PtEmail"/>
    </xsl:if>-->
</xsl:for-each>

想知道是否有人可以帮助我说明为什么使用这种语法,如果可能的话

2 个答案:

答案 0 :(得分:0)

如果您尝试使用包含“ tel”和“ mailto”的telecom/@value的值来设置这些变量,那么您就不想使用xsl:for-each。在xsl:for-each内部分配变量将意味着它们将在for循环的下一次迭代中立即超出范围。

您可以应用谓词来选择与包含条件匹配的telecom/@value,然后选择其值:

<xsl:variable name="Telecom" select="ClinicalDocument/recordTarget/patientRole/telecom/@value"/>
<xsl:variable name="PtPhoneNumber" select="$Telecom[contains(., 'tel')]"/>
<xsl:variable name="PtEmail" select="$Telecom[contains(., 'mailto')]"/>

您的样本数据只有一个。如果碰巧有多个“ tel”或“ mailto”值,则可以通过添加另一个谓词来选择其中一个匹配项来选择第一个匹配项:

<xsl:variable name="PtPhoneNumber" select="$Telecom[contains(., 'tel')][1]"/>
<xsl:variable name="PtEmail" select="$Telecom[contains(., 'mailto')][1]"/>

答案 1 :(得分:0)

您已经对要执行的处理步骤进行了非常程序化的描述,而我们真正需要的是对要产生的输出及其与输入的关系的描述。 XSLT是一种功能语言,在功能语言中,您不指示计算机执行循环并为变量分配值,而是将输出描述为输入的函数。因此,恐怕如果您来自程序语言的背景,那么您必须以不同于以往的方式来思考。

您已尝试编写过程代码,但无法正常工作。从不起作用的代码对需求进行逆向工程并不容易。为我们显示所需的输出!