ƒобро пожаловать в форум, Guest††>>†† ¬ойти†|†–егистрац舆| ѕоиск†|†ѕравила†| ¬ избранное | ѕодписатьс€
¬се форумы / XML, XSL, XPath, XQuery Ќовый топик †† ќтветить
  ак отфильтровать табличку с помощью XSLT  [new]
aron19
Member

ќткуда:
—ообщений: 4
ƒоброго времени суток! имеетс€ такой XML

<xsd:element name="">
		<xsd:annotation>
			<xsd:documentation>Ёлементы</xsd:documentation>
		</xsd:annotation>
	<xsd:complexType>
	<xsd:sequence>
		<xsd:element name="Ёлемент1" minOccurs="1" maxOccurs="unbounded">
			<xsd:annotation>
				<xsd:documentation>Ёлемент1</xsd:documentation>
			</xsd:annotation>
    <xsd:complexType>
         <xsd:sequence>
			<xsd:element name="Ёлемент1.1" type="xsd:string" minOccurs="1" maxOccurs="unbounded">
				<xsd:annotation>
				   <xsd:documentation>Ёлемент1.1</xsd:documentation>
				</xsd:annotation>
			</xsd:element>
			<xsd:element name="Ёлемент1.2" minOccurs="1" maxOccurs="1">
               <xsd:annotation>
                  <xsd:documentation>Ёлемент1.2</xsd:documentation>
               </xsd:annotation>
               <xsd:complexType>
                  <xsd:sequence>
				     <xsd:element name="Ёлемент1.2.1" minOccurs="1" maxOccurs="1">
                        <xsd:annotation>
							<xsd:documentation>Ёлемент1.2.1</xsd:documentation>
                        </xsd:annotation>
                       </xsd:element>
					 <xsd:element name="Ёлемент1.2.2" minOccurs="1" maxOccurs="1">
                        <xsd:annotation>
                           <xsd:documentation>Ёлемент1.2.2</xsd:documentation>
                        </xsd:annotation>
                       </xsd:element>
                     <xsd:element name="Ёлемент1.2.3" minOccurs="1" maxOccurs="1">
                        <xsd:annotation>
                           <xsd:documentation>Ёлемент1.2.3</xsd:documentation>
                        </xsd:annotation>
                       </xsd:element>
                    </xsd:sequence>
               </xsd:complexType>
            </xsd:element>
			    <xsd:element name="Ёлемент1.3" minOccurs="0" maxOccurs="unbounded">
	     <xsd:annotation>
                <xsd:documentation>Ёлемент1.3.1</xsd:documentation>
              </xsd:annotation>
				<xsd:complexType>
                    <xsd:sequence>
                     <xsd:element name="Ёлемент1.3.2" minOccurs="0">
                        <xsd:annotation>
                           <xsd:documentation>Ёлемент1.3.2</xsd:documentation>
                        </xsd:annotation>
                        </xsd:element>
			      <xsd:element name="Ёлемент1.3.3" minOccurs="0">
                        <xsd:annotation>
                           <xsd:documentation>Ёлемент1.3.3</xsd:documentation>
                        </xsd:annotation>
                       </xsd:element>
					 <xsd:element name="Ёлемент1.3.4" minOccurs="0">
                        <xsd:annotation>
                           <xsd:documentation>Ёлемент1.3.4</xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="“аблица1.4" minOccurs="1" maxOccurs="1">
               <xsd:annotation>
                  <xsd:documentation>“аблица1.4</xsd:documentation>
               </xsd:annotation>
               <xsd:complexType>
                  <xsd:sequence>
                     <xsd:element name="Ёлемент1.4.1" minOccurs="1" maxOccurs="unbounded">
                        <xsd:annotation>
                           <xsd:documentation>Ёлемент1.4.1</xsd:documentation>
                        </xsd:annotation>
                        <xsd:complexType>
                           <xsd:sequence>
			         <xsd:element name="Ёлемент1.4.1.1" type="xsd:string" minOccurs="1" maxOccurs="unbounded">
					<xsd:annotation>
					<xsd:documentation>Ёлемент1.4.1.1</xsd:documentation>
					</xsd:annotation>
					</xsd:element>
                              <xsd:element name="Ёлемент1.4.1.2" minOccurs="1" maxOccurs="1">
                                 <xsd:annotation>
                                    <xsd:documentation>Ёлемент1.4.1.2</xsd:documentation>
                                 </xsd:annotation>
                                 </xsd:element>
                              <xsd:element name="Ёлемент1.4.1.3" minOccurs="1" maxOccurs="1">
                                 <xsd:annotation>
                                    <xsd:documentation>Ёлемент1.4.1.3</xsd:documentation>
                                 </xsd:annotation>
                                 </xsd:element>
                              <xsd:element name="Ёлемент1.4.1.4" minOccurs="1" maxOccurs="1">
                                 <xsd:annotation>
                                    <xsd:documentation>Ёлемент1.4.1.4</xsd:documentation>
                                 </xsd:annotation>
                                 </xsd:element>
                              <xsd:element name="Ёлемент1.4.1.5" minOccurs="1" maxOccurs="1">
                                 <xsd:annotation>
                                    <xsd:documentation>Ёлемент1.4.1.5</xsd:documentation>
                                 </xsd:annotation>
                                 </xsd:element>
		
          


ѕодскажите пожалуйста, как на выходе получить только “аблицу 1.4, и не захватить ничего лишнего
28 фев 19, 10:56††††[21821477]     ќтветить | ÷итировать —ообщить модератору
 Re:  ак отфильтровать табличку с помощью XSLT  [new]
_Vasilisk_
Member

ќткуда: ”краина, ’арьков
—ообщений: 11288
<xsl:template match="/">
  <xsl:apply-templates select="root/Ёлемент1/Ёлемент1/“аблица1.4"/>
</xsl:template>

<xsl:template match="“аблица1.4">
  <xsl:copy/>
</xsl:template>

√де root название вот этого
aron19
<xsd:element name="">
узла
28 фев 19, 15:30††††[21821875]     ќтветить | ÷итировать —ообщить модератору
 Re:  ак отфильтровать табличку с помощью XSLT  [new]
aron19
Member

ќткуда:
—ообщений: 4
_Vasilisk_ , спасибо большое за ответ, а как сделать так, что бы в этой отсортированной табличке ,в узле "Ёлемент1.4.1.2" были перечислены колы систем, дл€ которых данна€ строка €вл€етс€ релевантной?
13 мар 19, 10:10††††[21831006]     ќтветить | ÷итировать —ообщить модератору
 Re:  ак отфильтровать табличку с помощью XSLT  [new]
_Vasilisk_
Member

ќткуда: ”краина, ’арьков
—ообщений: 11288
aron19
как сделать так, что бы в этой отсортированной табличке ,в узле "Ёлемент1.4.1.2" были перечислены колы систем, дл€ которых данна€ строка €вл€етс€ релевантной?
ѕопробуйте еще раз объ€снить, что вам нужно.

» приведите XML, а не XSD схему
13 мар 19, 13:59††††[21831323]     ќтветить | ÷итировать —ообщить модератору
 Re:  ак отфильтровать табличку с помощью XSLT  [new]
aron19
Member

ќткуда:
—ообщений: 4
»меетс€ только XSD схема ) из которой мне нужно отфильтровать только небольшую часть ,а именно табличку 1.4. » сделать так, что бы на выходе после преобразовани€ у мен€ были только значени€ элементов, которые вход€т в эту табличку. Ќо при всЄ при этом у элемента 1.4.1.2 может быть не одно значение, а несколько. » нужно сделать их перечисление с помощью ";".  ак то так.
13 мар 19, 16:11††††[21831494]     ќтветить | ÷итировать —ообщить модератору
 Re:  ак отфильтровать табличку с помощью XSLT  [new]
_Vasilisk_
Member

ќткуда: ”краина, ’арьков
—ообщений: 11288
aron19
»меетс€ только XSD схема ) из которой мне нужно отфильтровать только небольшую часть
¬ы на преобразование отдаете XML или XSD?
aron19
. Ќо при всЄ при этом у элемента 1.4.1.2 может быть не одно значение, а несколько
XSD-схема с вами не согласна
aron19
<xsd:element name="Ёлемент1.4.1.2" minOccurs="1" maxOccurs="1">
13 мар 19, 19:53††††[21831771]     ќтветить | ÷итировать —ообщить модератору
 Re:  ак отфильтровать табличку с помощью XSLT  [new]
_Vasilisk_
Member

ќткуда: ”краина, ’арьков
—ообщений: 11288
<xsl:template match="/">
  <xsl:apply-templates select="Ёлементы/Ёлемент1/Ёлемент1/“аблица1.4"/>
</xsl:template>

<xsl:template match="Ёлемент1.4.1.2">
  <xsl:if test="position() != 1">
    <xsl:text>;</xsl:text>
  </xsl:if>
  <xsl:value-of select="."/>
</xsl:template>

<xsl:template match="*">
  <xsl:copy>
    <xsl:apply-templates select="*"/>
  </xsl:copy>
</xsl:template>
13 мар 19, 19:58††††[21831777]     ќтветить | ÷итировать —ообщить модератору
 Re:  ак отфильтровать табличку с помощью XSLT  [new]
aron19
Member

ќткуда:
—ообщений: 4
_Vasilisk_,
—пасибо, за все сообщени€ выше разобралс€ с XSD и XML)
»меетс€ вот така€ XML
   <ns0:Ёлементы>
      <ns0:Ёлемент1/>
      <ns0:Ёлемент2>
         <ns0:Ёлемент2.1/>
         <ns0:Ёлемент2.2/>
         <ns0:Ёлемент2.3/>
         <ns0:Ёлемент2.4/>
         <ns0:Ёлемент2.5/>
         <ns0:Ёлемент2.6/>
       </ns0:Ёлемент2>
      <ns0:Ёлемент3>
         <ns0:Ёелемент3.1/>
         <ns0:Ёелемент3.2/>
         <ns0:Ёелемент3.3/>
      </ns0:Ёелемент3>
      <ns0:Ёелемент4>
         <ns0:Ёелемент4.1>
            <ns0:Ёелемент4.1.1/>ABC</ns0:Ёлемент4.1.1>
            <ns0:Ёелемент4.1.2>DEF</ns0:Ёлемент4.1.1>
            <ns0:Ёелемент4.1.3/>123</ns0:Ёлемент4.1.1>
            <ns0:Ёелемент4.1.4/>444</ns0:Ёлемент4.1.1>
            <ns0:Ёелемент4.1.5/>321</ns0:Ёлемент4.1.1>
         </ns0:Ёелемент4.1>
 <ns0:Ёелемент4.1>
            <ns0:Ёелемент4.1.1/>123</ns0:Ёлемент4.1.1>
            <ns0:Ёелемент4.1.2>555</ns0:Ёлемент4.1.1>
            <ns0:Ёелемент4.1.3/>123</ns0:Ёлемент4.1.1>
            <ns0:Ёелемент4.1.4/>444</ns0:Ёлемент4.1.1>
            <ns0:Ёелемент4.1.5/>321</ns0:Ёлемент4.1.1>
         </ns0:Ёелемент4.1>
      </ns0:Ёелемент4>
   </ns0:Ёлементы>


дл€ фильтрации использую следующую xsl
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns0="http://www.w3.org/1999/XSL/Transform2">
<xsl:output method="xml"/>
<xsl:variable name="System" select="ABC"/>

 
<xsl:template match="node()|@*">
  <xsl:copy>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>
  
 <xsl:template match="ns0:Ёелемент4.1">
 <xsl:if test="ns0:System =ABC">
  <xsl:copy-of select="*"/>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

Ќа выходе получаю следующее
<ns0:Ёлементы>
      <ns0:Ёлемент1/>
      <ns0:Ёлемент2>
         <ns0:Ёлемент2.1/>
         <ns0:Ёлемент2.2/>
         <ns0:Ёлемент2.3/>
         <ns0:Ёлемент2.4/>
         <ns0:Ёлемент2.5/>
         <ns0:Ёлемент2.6/>
       </ns0:Ёлемент2>
      <ns0:Ёлемент3>
         <ns0:Ёелемент3.1/>
         <ns0:Ёелемент3.2/>
         <ns0:Ёелемент3.3/>
      </ns0:Ёелемент3>
      <ns0:Ёелемент4>
         <ns0:Ёелемент4.1>
           
         </ns0:Ёелемент4.1>
      </ns0:Ёелемент4>
   </ns0:Ёлементы>


а ожидаю получить отсортированную xml где в элементе 4.1.1 имеетс€ ABC
<ns0:Ёлементы>
      <ns0:Ёлемент1/>
      <ns0:Ёлемент2>
         <ns0:Ёлемент2.1/>
         <ns0:Ёлемент2.2/>
         <ns0:Ёлемент2.3/>
         <ns0:Ёлемент2.4/>
         <ns0:Ёлемент2.5/>
         <ns0:Ёлемент2.6/>
       </ns0:Ёлемент2>
      <ns0:Ёлемент3>
         <ns0:Ёелемент3.1/>
         <ns0:Ёелемент3.2/>
         <ns0:Ёелемент3.3/>
      </ns0:Ёелемент3>
      <ns0:Ёелемент4>
         <ns0:Ёелемент4.1>
            <ns0:Ёелемент4.1.1/>ABC</ns0:Ёлемент4.1.1>
            <ns0:Ёелемент4.1.2>DEF</ns0:Ёлемент4.1.1>
            <ns0:Ёелемент4.1.3/>123</ns0:Ёлемент4.1.1>
            <ns0:Ёелемент4.1.4/>444</ns0:Ёлемент4.1.1>
            <ns0:Ёелемент4.1.5/>321</ns0:Ёлемент4.1.1>
         </ns0:Ёелемент4.1>
         </ns0:Ёелемент4>
   </ns0:Ёлементы>


ѕодскажите в чем может быть ошибка?
21 мар 19, 15:58††††[21839784]     ќтветить | ÷итировать —ообщить модератору
 Re:  ак отфильтровать табличку с помощью XSLT  [new]
_Vasilisk_
Member

ќткуда: ”краина, ’арьков
—ообщений: 11288
aron19
ѕодскажите в чем может быть ошибка?
¬от эта строка
aron19
<xsl:if test="ns0:System =ABC">
ѕровер€ет равно ли значение узла ns0:System узлу ABC. “.к. вам нужно проверить на равенство строке то ABC нужно вз€ть в кавычки
<xsl:template match="ns0:Ёелемент4.1">
  <xsl:if test="ns0:System = 'ABC'">
    <xsl:copy-of select="*"/>
  </xsl:if>
</xsl:template>

» смысла в этой строке
aron19
<xsl:variable name="System" select="ABC"/>
€ не вижу

¬торой вариант решени€ - определить фильтрующий шаблон
<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ns0="http://www.w3.org/1999/XSL/Transform2">

  <!-- ƒл€ всех ns0:Ёлемент4.1 у которых дочерний элемент ns0:Ёелемент4.1.1
        не равен 'ABC' - ничего делать не нужно -->
  <xsl:template match="ns0:Ёлемент4.1[ns0:Ёелемент4.1.1 != 'ABC']"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
„то будет работать быстрее - не знаю
21 мар 19, 17:01††††[21839877]     ќтветить | ÷итировать —ообщить модератору
¬се форумы / XML, XSL, XPath, XQuery ќтветить