xsl: значение-выбор из определенной строки XSLT - PullRequest
1 голос
/ 07 ноября 2019

Я новичок в XSLT и у меня проблема. Мой код выглядит так:

<xsl:element name="relatedArticle1">
    <xsl:value-of select="translate(ancestor-or-self::node()/CrossSelling/CSArtikel/@ArtikelNr,'-','')"/>
</xsl:element>
<xsl:element name="relatedArticle2">
    <xsl:value-of select="translate(ancestor-or-self::node()/CrossSelling/CSArtikel/@ArtikelNr[@Index = '2'],'-','')"/>
</xsl:element>
<xsl:element name="relatedArticle3">
    <xsl:value-of select="translate(ancestor-or-self::node()/CrossSelling/CSArtikel/@ArtikelNr[@Index = '3'],'-','')"/>
</xsl:element>
<xsl:element name="relatedArticle4">
    <xsl:value-of select="translate(ancestor-or-self::node()/CrossSelling/CSArtikel/@ArtikelNr[@Index = '4'],'-','')"/>
</xsl:element>
<xsl:element name="relatedArticle5">
    <xsl:value-of select="translate(ancestor-or-self::node()/CrossSelling/CSArtikel/@ArtikelNr[@Index = '5'],'-','')"/>
</xsl:element>

Что он должен делать:

это должно дать мне

<relatedArticle1>2810000001</relatedArticle1>
<relatedArticle1>2810000002</relatedArticle1>

, потому что файл XML выглядит так:

<CrossSelling>
    <CSArtikel Index="1" BildNr="009710" ArtikelNr="281-00-00001" FabrikartikelNr="Shoe Clean 905768" />
    <CSArtikel Index="2" BildNr="009709" ArtikelNr="281-00-00002" FabrikartikelNr="Combi Pflege Schaum 905859" />
    <CSArtikel Index="3" BildNr="009713" ArtikelNr="062-00-00010" FabrikartikelNr="Nano Plus 906992" />
    <CSArtikel Index="4" BildNr="009720" ArtikelNr="062-00-00011" FabrikartikelNr="906802" />
    <CSArtikel Index="5" BildNr="008667" ArtikelNr="069-00-00008" FabrikartikelNr="Poliertuch 905856" />
</CrossSelling>

но это не так.

, поэтому [@Index = '3'] для выбора строки 3 fe не работает.

Как я могу изменить код, чтобы он получал изразные линии?

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Я настоятельно не рекомендую создавать «подсчитанные» имена клемментов. Если есть три экземпляра вещи, например «связанная статья», то они относятся к одному типу. Они должны иметь одинаковое имя.

"Связанная статья № 3" должна быть не <relatedArticle3>, а просто третьей <relatedArticle> в строке.

Кроме того, вам не нужно использовать <xsl:element> для элементов с предопределенным именем. Просто напишите <element> напрямую.

Наконец, ваш подход слишком слишком сложный. Используйте <xsl:apply-templates> и относительные XPath, например, так:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes" />

  <xsl:template match="/*">
    <relatedArticles>
      <xsl:apply-templates select="CSArtikel" />
    </relatedArticles>
  </xsl:template>

  <xsl:template match="CSArtikel">
    <relatedArticle>
      <xsl:value-of select="@ArtikelNr" />
    </relatedArticle>
  </xsl:template>
</xsl:stylesheet>

, что приводит к:

<relatedArticles>
   <relatedArticle>281-00-00001</relatedArticle>
   <relatedArticle>281-00-00002</relatedArticle>
   <relatedArticle>062-00-00010</relatedArticle>
   <relatedArticle>062-00-00011</relatedArticle>
   <relatedArticle>069-00-00008</relatedArticle>
</relatedArticles>

Если вы хотите получить третью статью из этого, этотак же просто, как /relatedArticles/relatedArticle[3], однако отсутствие каждого элемента с другим именем сделает любую обработку XML позже намного проще.

0 голосов
/ 07 ноября 2019

хорошо, у меня просто было неправильное положение.

это работает:

                                <xsl:element name="relatedArticle1">
        <xsl:value-of select="translate(ancestor-or-self::node()/CrossSelling/CSArtikel/@ArtikelNr,'-','')"/>
                            </xsl:element>
                            <xsl:element name="relatedArticle2">
        <xsl:value-of select="translate(ancestor-or-self::node()/CrossSelling/CSArtikel[@Index = '2']/@ArtikelNr,'-','')"/>
                            </xsl:element>
                            <xsl:element name="relatedArticle3">
        <xsl:value-of select="translate(ancestor-or-self::node()/CrossSelling/CSArtikel[@Index = '3']/@ArtikelNr,'-','')"/>
                            </xsl:element>
                            <xsl:element name="relatedArticle4">
        <xsl:value-of select="translate(ancestor-or-self::node()/CrossSelling/CSArtikel[@Index = '4']/@ArtikelNr,'-','')"/>
                            </xsl:element>
                            <xsl:element name="relatedArticle5">
        <xsl:value-of select="translate(ancestor-or-self::node()/CrossSelling/CSArtikel[@Index = '5']/@ArtikelNr,'-','')"/>
                            </xsl:element>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...