xsl: для каждого номера телефона в переменной - PullRequest
0 голосов
/ 11 октября 2018

Я новичок в работе с xsl.Мне нужно перебрать некоторые элементы xml: "telecom", и для каждого из них мне нужно искать, содержит ли он тел, если он присваивает его переменной PtPhoneNumber.Затем, если он содержит mailto, назначьте его PtEmail.

Вот XML:

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

Вот мой XPath для цикла и операторы 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>

Wonderingесли кто-то может помочь мне, почему этот синтаксис и если это возможно

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вы дали очень процедурное описание шагов обработки, которые вы хотите выполнить, тогда как нам действительно нужно описание вывода, которое вы хотите произвести, и как оно связано с вводом.XSLT - это функциональный язык, и на функциональном языке вы не предписываете компьютеру выполнять циклы и присваивать значения переменным, а вы описываете выход как функцию от ввода.Поэтому я боюсь, что если вы пришли из опыта в процедурных языках, вам придется думать совсем иначе, чем вы привыкли.

Вы пытались написать процедурный код, но это не такидти на работу.Обратный инжиниринг ваших требований из кода, который не работает, не прост.Покажите нам требуемый вывод вместо этого!

0 голосов
/ 11 октября 2018

Если вы пытаетесь установить эти переменные со значениями telecom/@value, которые содержат "tel" и "mailto", то вы не хотите использовать 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]"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...