XSLT MUENCHIAN МЕТОД для всех узлов - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь получить значение атрибута для предка элементов, себя и потомков.И тогда я хочу отобразить уникальные значения.

Это то, что я пытаюсь.

<xsl:key name="remove" match="value" use="sortedvalues" />

<xsl:for-each select="ancestor-or-self::node()/@value[generate-id() = generate-id(key('remove',sortedvalues)[1])] | descendant-or-self::node()/@value[generate-id() = generate-id(key('remove',sortedvalues)[1])]">

            <xsl:for-each select="key('remove',sortedvalues)">
            <xsl:sort select="sortedvalues"></xsl:sort>

            </xsl:for-each>

            </xsl:for-each>

А вот фактический XML

<Root>

     <something value = “asd” </something>
    <something value = “dsa” </something>
  <Product>
    <something value = "asd"></something>
    <something value = "dsa"></something>
    <something value = "asd"></something>

    <anothernode>
    <something value = "qwe"></something>
    </anothernode>

    <anothernode2>
    <something value = "ewq"></something>
    </anothernode2>

    <something value = "ewq"></something>

<Product>

  <Product>
    <something value = "asd"></something>
    <something value = "dsa"></something>
    <something value = "asd"></something>

    <anothernode>
    <something value = "qwe"></something>
    </anothernode>

    <anothernode2>
    <something value = "ewq"></something>
    </anothernode2>

    <something value = "ewq"></something>

<Product>
</Root>

Я в основном хочу показать

<Product>
    <values>asd <values>
    <values>dsa<values>
    <values>qwe<values>
    <values>ewq<values>
<Product>


<Product>
    <values>asd <values>
    <values>dsa<values>
    <values>qwe<values>
    <values>ewq<values>
<Product>

Так что я не могу использовать //, чтобы показать для каждого отдельного продукта такЯ использую предка и потомка в Product

1 Ответ

0 голосов
/ 23 мая 2018

Если вы хотите получить уникальные атрибуты value по продукту, вам нужно будет сделать ссылку на часть продукта ключа

 <xsl:key name="values" match="@value" use="concat(generate-id(ancestor::Product), '|', .)" />

Затем для данного продукта вы получитетакие разные значения (где $id - это переменная, содержащая значение generate-id () для продукта)

<xsl:for-each select=".//@value[generate-id() = generate-id(key('values', concat($id, '|', .))[1])]">

Попробуйте это XSLT

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

  <xsl:key name="values" match="@value" use="concat(generate-id(ancestor::Product), '|', .)" />

  <xsl:template match="Product">
    <xsl:variable name="id" select="generate-id()" />
    <xsl:copy>
        <xsl:for-each select=".//@value[generate-id() = generate-id(key('values', concat($id, '|', .))[1])]">
            <values><xsl:value-of select="." /></values>
        </xsl:for-each>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Обратите внимание, если выможно обновить до XSLT 2.0, тогда вы можете использовать xsl:for-each-group, например,

<xsl:for-each-group select=".//@value" group-by=".">

, или вы можете использовать distinct-values(), например,

<xsl:for-each select="distinct-values(.//@value)">
.
...