Как получить значения всех вхождений одного и того же элемента в XSLT? - PullRequest
2 голосов
/ 04 октября 2010

У меня есть XML-файл типа:

<company>
  <dept>
    <name> Dept-A</name>
    <proj> 
      <id> A1 </id>
      <noOfPeople> 5 </noOfPeople>
      <proj> 
        <id>A11</id>
        <noOfPeople> 2 </noOfPeople>
      </proj>
    </proj>
  </dept>
  <dept>
      ....
  </dept>
</company>

Сейчас:

  1. Я хочу получить список всех проектов. Даже если они являются субпроектами, такими как A11 внутри A1, я хочу каждый отдельный идентификатор проекта.
  2. Кроме того, я хочу, чтобы этот список был доступен для меня в нескольких местах, напр. При разборе проекта A1 или при разборе A11 или любого другого уровня вложенности proj.

Есть ли способ достичь этого в XSLT?

Спасибо.
Тара Сингх

Ответы [ 2 ]

2 голосов
/ 04 октября 2010
  1. Я хочу получить список всех проектов. Даже если они Sub Такие проекты, как A11 внутри A1, я хочу каждый отдельный идентификатор проекта.

  2. Кроме того, я хочу, чтобы этот список был доступен для меня в нескольких местах, Ex. При разборе проекта А1 или во время разбор A11 или любой другой уровень вложенности проекта

Есть ли способ достичь этого в XSLT?

Вы не указали, возможно ли иметь более одного элемента <proj> с таким же значением его дочернего элемента <id>.

Вот решение XSLT, которое определяет две глобальные переменные , одна - набор узлов всех элементов <id> в документе XML, другая - набор узлов из <id> элементов каждая значение которого отличается от значений остальных, и все значения <id> s представлены отдельно.

Поскольку это глобальные переменные, они доступны в любой точке вашего кода XSLT, даже в импортированных / включенных или импортируемых / включающих таблицы стилей.

<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="kIdByVal" match="id" use="."/>

 <xsl:variable name="vallProjIds" select="//proj/id"/>

 <xsl:variable name="vdistinctProjIds" select=
  "//proj/id[generate-id()
            =
             generate-id(key('kIdByVal', .)[1])
            ]
  "/>

 <xsl:template match="/">
  All Project IDs:
  <xsl:for-each select="$vallProjIds">
    <xsl:value-of select="concat(.,'&#xA;')"/>
  </xsl:for-each>
  All Distinct Project IDs:
  <xsl:for-each select="$vdistinctProjIds">
    <xsl:value-of select="concat(.,'&#xA;')"/>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к следующему документу XML (основано на предоставленном документе, но выполнено правильно и расширено, чтобы охватить больше случаев):

<company>
  <dept>
    <name> Dept-A</name>
    <proj>
      <id> A1 </id>
      <noOfPeople> 5 </noOfPeople>
      <proj>
        <id>A11</id>
        <noOfPeople> 2 </noOfPeople>
      </proj>
    </proj>
  </dept>
  <dept>
    <name> Dept-B</name>
    <proj>
      <id> A1 </id>
      <noOfPeople> 5 </noOfPeople>
    </proj>
    <proj>
      <id> B1 </id>
      <noOfPeople> 5 </noOfPeople>
      <proj>
        <id>B11</id>
        <noOfPeople> 2 </noOfPeople>
      </proj>
    </proj>
  </dept>
</company>

желаемый, правильный результат выдается :

  All Project IDs:
   A1 
   A11
   A1 
   B1 
   B11

  All Distinct Project IDs:
   A1 
   A11
   B1 
   B11

Обратите внимание , что это решение использует метод Мюнхена для группировки, чтобы получить набор Id s с уникальными значениями.

1 голос
/ 04 октября 2010

Да, это возможно.

Следующее выражение XPath выберет все proj элементы в документе:

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