Xpath - Как получить все существующие атрибуты имени братьев и сестер - PullRequest
0 голосов
/ 28 февраля 2019

Цель проста.Я пытаюсь построить таблицу с атрибутами в столбцах.

Моя проблема: у некоторых братьев и сестер атрибуты не такие, как у первого.Когда я строю заголовок таблицы, я получаю имя атрибута первого узла и затем надеюсь, что атрибуты следующих братьев и сестер будут одинаковыми в том же порядке.Это не относится к делу.Я получаю только столбцы id, key, value, myattr1, а атрибут myattr2 помещается в столбец myattr1.

Для построения таблицы я хочу получить столбцы: id, key, value, myattr1, myattr2

Как можноЯ получаю весь список существующих атрибутов для узла, над которым я работаю, и зацикливаюсь на нем?

Я все еще работаю с той же js и формой (см. Ссылку внизу).Теперь требуется начальная загрузка (CSS и JS).

Я немного изменил XML.Вот оно:

<?xml version="1.0" encoding="UTF-8"?>
<Domain>
  <Properties id="myid">
    <Property id="DOM00000" key="mykey1" value="value1" myattr2="Mail"/>
    <Property id="DOM00001" key="mykey2" value="value2" myattr1="EveryDay"/>
  </Properties>
  <Tokens>
    <Token name="token1" comment="" ><![CDATA[mydata1---blah-blah-blah]]></Token>
    <Token name="token2" comment="" ><![CDATA[mydata2---blah-blah-blah]]></Token>
  </Tokens>
  <Resources>
    <Resource name="res1" type="W" current="0">
      <Value><![CDATA[10]]></Value>
    </Resource>
    <Resource name="res2" type="W" current="0">
      <Value><![CDATA[10]]></Value>
    </Resource>
  </Resources>
</Domain>

Текущее состояние xsl:

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

<xsl:template match="/*">
    <xsl:element name="div">
        <xsl:attribute name="class">container</xsl:attribute>
        <ul class="nav nav-tabs">
            <xsl:for-each select="./*">
                <xsl:call-template name="tabs" />
            </xsl:for-each>
        </ul>
    </xsl:element>
    <xsl:element name="div">
    <xsl:attribute name="class">tab-content</xsl:attribute>
        <xsl:for-each select="./*">
                <xsl:call-template name="tabcontent" />
        </xsl:for-each> 
    </xsl:element>
</xsl:template>


<xsl:template name="tabs">
    <xsl:variable name="active">
        <xsl:choose>
            <xsl:when test="preceding-sibling::*"></xsl:when>
            <xsl:otherwise>active</xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <xsl:element name="li">
        <xsl:attribute name="class">nav-item <xsl:value-of select="$active" /></xsl:attribute>
        <xsl:element name="a">
            <xsl:attribute name="href">#<xsl:value-of select="name(.)" /></xsl:attribute>
            <xsl:attribute name="class">nav-link</xsl:attribute>
            <xsl:attribute name="data-toggle">tab</xsl:attribute>
            <xsl:value-of select="name(.)" />
        </xsl:element>

    </xsl:element>      
</xsl:template>

<xsl:template name="tabcontent">
    <xsl:variable name="activetab">
        <xsl:choose>
            <xsl:when test="preceding-sibling::*"></xsl:when>
            <xsl:otherwise>active in</xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <xsl:element name="div">
        <xsl:attribute name="id"><xsl:value-of select="name(.)" /></xsl:attribute>
        <xsl:attribute name="class">container tab-pane fade <xsl:value-of select="$activetab" /></xsl:attribute>
        <h3><xsl:value-of select="name(.)" /></h3>
        <table class="table table-striped table-hover">
            <thead>
                <tr><xsl:for-each select="./*[1]/@*"><th><xsl:value-of select="name(.)" /></th></xsl:for-each></tr>
            </thead>
            <tbody>
                <xsl:for-each select="./*"><tr>
                    <xsl:for-each select="./@*"><td><xsl:value-of select="." /></td></xsl:for-each></tr>
                </tr></xsl:for-each>
            </tbody>
        </table>
    </xsl:element>
</xsl:template>

</xsl:stylesheet> 

XSLT - Как управлять CDATA как общим контентом?

Edit:

Благодаря Tim-C ​​ answer Вот полный xsl, работающий для моего варианта использования:

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

<xsl:key name="attrs" match="/*/*/*/@*" use="concat(name(../..), '|', name())" />   

<xsl:template match="/*">
    <xsl:element name="div">
        <xsl:attribute name="class">container</xsl:attribute>
        <ul class="nav nav-tabs">
            <xsl:for-each select="./*">
                <xsl:call-template name="tabs" />
            </xsl:for-each>
        </ul>
    </xsl:element>
    <xsl:element name="div">
    <xsl:attribute name="class">tab-content</xsl:attribute>
        <xsl:for-each select="./*">
                <xsl:call-template name="tabcontent" />
        </xsl:for-each> 
    </xsl:element>
</xsl:template>


<xsl:template name="tabs">
    <xsl:variable name="active">
        <xsl:choose>
            <xsl:when test="preceding-sibling::*"></xsl:when>
            <xsl:otherwise>active</xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <xsl:element name="li">
        <xsl:attribute name="class">nav-item <xsl:value-of select="$active" /></xsl:attribute>
        <xsl:element name="a">
            <xsl:attribute name="href">#<xsl:value-of select="name(.)" /></xsl:attribute>
            <xsl:attribute name="class">nav-link</xsl:attribute>
            <xsl:attribute name="data-toggle">tab</xsl:attribute>
            <xsl:value-of select="name(.)" />
        </xsl:element>

    </xsl:element>      
</xsl:template>

<xsl:template name="tabcontent">
    <xsl:variable name="activetab">
        <xsl:choose>
            <xsl:when test="preceding-sibling::*"></xsl:when>
            <xsl:otherwise>active in</xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <xsl:variable name="attrs" select="*/@*[generate-id() = generate-id(key('attrs', concat(name(../..), '|', name()))[1])]" />
    <xsl:element name="div">
        <xsl:attribute name="id"><xsl:value-of select="name(.)" /></xsl:attribute>
        <xsl:attribute name="class">container tab-pane fade <xsl:value-of select="$activetab" /></xsl:attribute>
        <h3><xsl:value-of select="name(.)" /></h3>
        <table class="table table-striped table-hover">
        <thead>
            <tr>
                <xsl:for-each select="$attrs">
                <th>
                    <xsl:value-of select="name()" />
                </th>
                </xsl:for-each>
            </tr>
        </thead>
        <tbody>
            <xsl:for-each select="*">
            <tr>
                <xsl:variable name="current" select="." />
                <xsl:for-each select="$attrs">
                <td>
                    <xsl:value-of select="$current/@*[name() = name(current())]" />
                </td>
                </xsl:for-each>
            </tr>
            </xsl:for-each>
        </tbody>
  </table>
    </xsl:element>
</xsl:template>

<xsl:template name="toto"></xsl:template>




</xsl:stylesheet> 

1 Ответ

0 голосов
/ 28 февраля 2019

Здесь вы используете метод Muenchian Grouping для получения списка различных атрибутов, основанных на их имени.

Однако, хотя вопрос только упоминает о id, key, value, myattr1, myattr2, которые являются атрибутами Property, похоже, вы хотите повторить это также для узлов Token и Resource (т.е. вы пытаетесьбыть общим).В этом случае вы определяете ключ, подобный этому, который учитывает имя основного элемента

<xsl:key name="attrs" match="/*/*/*/@*" use="concat(name(../..), '|', name())" />

Затем, для данного элемента (такого как Properties) вы можете получить различные атрибуты, такие как:

<xsl:variable name="attrs" select="*/@*[generate-id() = generate-id(key('attrs', concat(name(../..), '|', name()))[1])]" />

Затем его можно использовать для получения заголовков и доступа к соответствующим атрибутам для каждой строки.

Попробуйте это (сокращенно) XSLT:

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

<xsl:key name="attrs" match="/*/*/*/@*" use="concat(name(../..), '|', name())" />

<xsl:template match="/*">
  <xsl:for-each select="*">
    <xsl:call-template name="tabcontent" />
  </xsl:for-each> 
</xsl:template>

<xsl:template name="tabcontent">
  <xsl:variable name="attrs" select="*/@*[generate-id() = generate-id(key('attrs', concat(name(../..), '|', name()))[1])]" />
  <table class="table table-striped table-hover">
    <thead>
      <tr>
        <xsl:for-each select="$attrs">
          <th>
            <xsl:value-of select="name()" />
          </th>
        </xsl:for-each>
      </tr>
    </thead>
    <tbody>
      <xsl:for-each select="*">
        <tr>
          <xsl:variable name="current" select="." />
          <xsl:for-each select="$attrs">
            <td>
              <xsl:value-of select="$current/@*[name() = name(current())]" />
            </td>
          </xsl:for-each>
        </tr>
      </xsl:for-each>
    </tbody>
  </table>
</xsl:template>
</xsl:stylesheet> 

См.это в действии в http://xsltfiddle.liberty -development.net / jyRYYi7

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