xsl:value-of从特定行XSLT中选择

时间:2019-11-07 18:30:49

标签: xml xslt

我对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行f.e.不起作用。

如何更改代码,使其从不同的行获取?

2 个答案:

答案 0 :(得分:1)

我强烈建议不要创建“计数”的元素名称。如果某事物有三个实例,例如“相关文章”,则它们属于同一类型。它们应该具有相同的名称。

“相关文章#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处理< / em>更容易。

答案 1 :(得分:0)

好吧,我只是把它放在错误的位置。

这有效:

                                <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>