Выполнение центра с помощью XSLT

Вы можете использовать np.where для замены значений в массиве согласно следующему условию:

np.where((mat == mat2).all(axis=2,  keepdims=True), [0,0], mat2)

array([[[0, 1],
        [0, 0],
        [0, 0]],

       [[0, 0],
        [0, 0],
        [0, 0]],

       [[0, 0],
        [2, 2],
        [0, 0]]])

Где (mat == mat2).all(axis=2, keepdims=True):

array([[[False],
        [ True],
        [ True]],

       [[ True],
        [ True],
        [ True]],

       [[ True],
        [False],
        [ True]]])

[1111 ] Возвращает маску тех же размеров, что и mat, которую можно использовать в качестве условия для np.where. Затем вам просто нужно указать, следует ли заменить эти значения на [0,0] или mat2 в зависимости от результата.

5
задан AJ. 8 January 2009 в 14:09
поделиться

3 ответа

Muench к спасению!

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" indent="yes" encoding="UTF-8"/>

    <xsl:key name="muench" match="/root/item/status" use="."/>

    <xsl:template match="/">
        <root>
        <xsl:for-each select="/root/item/status[generate-id() = generate-id(key('muench',.)[1])]">
            <xsl:call-template name="pivot">
                <xsl:with-param name="status" select="."/>
            </xsl:call-template>
        </xsl:for-each>
        </root>
    </xsl:template>

    <xsl:template name="pivot">
        <xsl:param name="status"/>
        <items>
            <status><xsl:value-of select="$status"/></status>
            <xsl:for-each select="/root/item[status=$status]">
                <name><xsl:value-of select="name"/></name>
            </xsl:for-each>
        </items>
    </xsl:template>

</xsl:stylesheet>
7
ответ дан 13 December 2019 в 19:37
поделиться

Да, это может быть сделано в XSLT 1.0

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 >
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <!--                                   -->
    <xsl:key name="kStatByVal" 
         match="status" use="."/>
    <!--                                   -->
    <xsl:key name="kItemByStat" 
         match="item" use="status"/>
    <!--                                   -->
    <xsl:variable name="vDoc" select="/"/>

    <xsl:template match="/">
      <top>
        <xsl:for-each select=
        "/*/*/status[generate-id()
                    =
                     generate-id(key('kStatByVal',.)[1])
                    ]">
          <items>
            <status><xsl:value-of select="."/></status>
          <xsl:for-each select="key('kItemByStat', .)">
            <xsl:copy-of select="name"/>
          </xsl:for-each>
          </items>
        </xsl:for-each>
      </top>
    </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется на исходный XML-документ:

<root>
    <item>
        <name>one</name>
        <status>good</status>
    </item>
    <item>
        <name>two</name>
        <status>good</status>
    </item>
    <item>
        <name>three</name>
        <status>bad</status>
    </item>
    <item>
        <name>four</name>
        <status>ugly</status>
    </item>
    <item>
        <name>five</name>
        <status>bad</status>
    </item>
</root>

К требуемому результату приводят:

<top>
    <items>
        <status>good</status>
        <name>one</name>
        <name>two</name>
    </items>
    <items>
        <status>bad</status>
        <name>three</name>
        <name>five</name>
    </items>
    <items>
        <status>ugly</status>
        <name>four</name>
    </items>
</top>

Действительно отметьте использование:

  1. Метод Muenchian для группировки

  2. Использование <xsl:key> и key() функция

4
ответ дан 13 December 2019 в 19:37
поделиться

Это зависит о Вашем xslt механизме. Если Вы используете xslt 1.0 без какого-либо расширения, то Ваш подход является, конечно, лучшим.

С другой стороны, если Вам разрешают использовать exslt (особенно расширение набора узлов) или xslt 2.0, затем Вы могли сделать это более универсальным способом:

  1. Соберите все доступные состояния
  2. Создайте набор узлов из полученного результата
  3. При итерации на этом наборе узлов создайте центр путем фильтрации Вас основа состояния на элементе тока в Вашем повторении.

Но прежде, чем сделать это, полагайте, что это может быть излишество, если у Вас только есть некоторые набор состояний и что добавление другого состояния довольно редко.

0
ответ дан 13 December 2019 в 19:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: