XSL проверка, если несколько элементов с одинаковым именем и атрибутом равны заданному тексту - PullRequest
1 голос
/ 30 марта 2012

Я пишу этот XSLT-файл и у меня возникают проблемы с тем, как сделать следующее.У меня есть список элементов с таким же атрибутом имени, и мне нужно скопировать их и проверить, есть ли у них текст Обязательный.Если ни один из элементов не добавляет добавляемый элемент.

Пример XML:

<record>
  </Title>
  </subTitle>
  <note tag='1'>
    <access tag='1'>nothing</access>
    <access tag='a'>Home</access>
    <access tag='a'>School</access>
  </note tag='1'>
</record>

С этим примером будет выведено:

<record>
  </Title>
  </subTitle>
  <note tag='1'>
    <access tag='1'>nothing</access>
    <access tag='a'>Home</access>
    <access tag='a'>School</access>
    <access tag="a'>Required</access>
  </note tag='1'>
</record>

Если получен результатxml снова прошел через xslt, он вывел бы без изменений.Я знаю, как это сделать, если доступ с атрибутом а будет только 1 элемент.У меня проблемы с проверкой нескольких.

Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 31 марта 2012

Вот краткое и простое решение :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match=
 "note[not(access[@tag = 'a' and . = 'Required'])]">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
   <access tag="a">Required</access>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к предоставленному документу XML (исправил сильно искаженный оригинал в правильно сформированный документ XML):

<record>
    <Title/>
    <subTitle/>
    <note tag='1'>
        <access tag='1'>nothing</access>
        <access tag='a'>Home</access>
        <access tag='a'>School</access>
    </note>
</record>

желаемый, правильный результат получается :

<record>
   <Title/>
   <subTitle/>
   <note tag="1">
      <access tag="1">nothing</access>
      <access tag="a">Home</access>
      <access tag="a">School</access>
      <access tag="a">Required</access>
   </note>
</record>
0 голосов
/ 30 марта 2012
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="note[count(access[text()='Required'])=0]">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <xsl:element name="access">
        <xsl:attribute name="tag">a</xsl:attribute>
        Required
        </xsl:element>
    </xsl:copy>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...