Извлечь только один текстовый узел с помощью XSLT / XPATH - PullRequest
0 голосов
/ 25 сентября 2018

Внизу у меня есть пример xml, где есть несколько элементов <offer>, каждый с дочерним элементом sku.Я хочу извлечь только текстовый узел элемента <sku>

Я пробовал следующий XPATH в XSLT, но ни один из них не дает мне только 390500 в качестве вывода.Все они заканчивают тем, что читали каждый текстовый узел в файле.

<xsl:template match="offer[sku/text()]">
    <xsl:value-of select="./text()"/>
</xsl:template>

<xsl:template match="offer/sku">
 <xsl:for-each select="sku">
    <xsl:value-of select="sku"/>
 </xsl:for-each>
</xsl:template>

XML

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<enfinity xmlns='http://www.intershop.com/xml/ns/enfinity/7.1/xcs/impex' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xml='http://www.w3.org/XML/1998/namespace' xmlns:dt='http://www.intershop.com/xml/ns/enfinity/6.5/core/impex-dt' xsi:schemaLocation="http://www.intershop.com/xml/ns/enfinity/7.1/xcs/impex catalog.xsd http://www.intershop.com/xml/ns/enfinity/6.5/core/impex-dt dt.xsd" major="6" minor="1" family="enfinity" branch="enterprise" build="build" >
    <offer sku="390500" >
        <available>1</available>
        <online>1</online>
        <product-type name="Basic" domain="system" ></product-type>
        <sku>390500</sku>
        <tax-class id="FullTax" ></tax-class>
        <supplier>
          <supplier-name>1573</supplier-name>
          <supplier-sku/>
        </supplier>
        <quantity unit="Piece" >
          <step-quantity>1</step-quantity>
          <price-quantity>1</price-quantity>
        </quantity>
        <custom-attributes>
          <custom-attribute name="Country" dt:dt="string" >
            <value>US</value>
          </custom-attribute>
          <custom-attribute name="LICENSED" dt:dt="string" >
            <value>Y</value>
          </custom-attribute>
          <custom-attribute name="LeadTime" dt:dt="string" >
            <value>001</value>
          </custom-attribute>
          <custom-attribute name="LifeCycle" dt:dt="string" >
            <value>03</value>
          </custom-attribute>
          <custom-attribute name="SalesOrganization" dt:dt="string" >
            <value>1573</value>
          </custom-attribute>
        </custom-attributes>
        <offered-product sku="390500" domain="LBS-LBSUS" ></offered-product>
        <type-code>258</type-code>
    </offer>
</enfinity>

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Выражение XPath //offer/sku/text() выделяет текст всех sku дочерних элементов всех offer элементов.

> xmllint --xpath '//offer/sku/text()' ~/net/test.xml
390500

Обратите внимание, что ваш исходный документ содержит пространство имен по умолчанию, вам необходимо обработать этосоответствующим образом, в зависимости от инструмента, который вы используете.В противном случае выбранный набор XPath будет пустым.

0 голосов
/ 25 сентября 2018

<xsl:value-of select="/enfinity/offer[1]/sku[1]"/> должен сделать свое дело.

Обратите внимание, что весь документ все равно будет размечен и помещен в ОЗУ, если вы используете XSLT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...