xsl: номер в дочернем узле - PullRequest
0 голосов
/ 21 апреля 2011

У меня есть XML, который выглядит следующим образом:

<A></A>
<A></A>
<A>
    <a/>
    <a/>
</A>

Как вы можете видеть, он имеет два уровня <A> и <a>.

Я написал XSL-преобразование, которое генерирует индексна каждом элементе <A>, и он работает:

<xsl:template match "A">
<xsl:element name="Person">
<xsl:attribute name="id">
<xsl:number count="A"/>
</xsl:attribute>
</xsl:element>
</xsl>

Вывод:

<Person id="1"/>
<Person id="2"/>
<Person id="3"/>

Но как написать xsl: число для генерации того же числа на уровне <a> (на ???)?

<xsl:template match "A">
<xsl:element name="Person">
<xsl:attribute name="id">
<xsl:number count="A"/>
<xsl:apply-templates select="a"/>
</xsl:attribute>
</xsl:element>
</xsl>
<xsl:template match "a">
<xsl:element name="Item">
<xsl:attribute name="id">
<xsl:number count="???"/>
</xsl:attribute>
</xsl:element>
</xsl>

Ожидаемый результат (я хочу тот же id для <Person> и <Item>):

<Person id="1"/>
<Person id="2"/>
<Person id="3">
   <Item id="3"/>
   <Item id="3"/>
</Person>

Я знаю, что это должен быть какой-то простой XPATHвыражение, но я действительно застрял на этом.

Ответы [ 3 ]

2 голосов
/ 21 апреля 2011

Вы можете просто передать вычисленное число вниз, если вы действительно хотите то же самое:

<xsl:template match="A">
  <xsl:variable name="id">
    <xsl:number count="A"/>
  </xsl:variable>
  <Person id="{$id}">
    <xsl:apply-templates select="a">
      <xsl:with-param name="pid" select="$id"/>
    </xsl:apply-templates>
  </Person>
</xsl:template>

<xsl:template match="a">
  <xsl:param name="pid"/>
  <Item id="{$pid}"/>
</xsl:template>
1 голос
/ 21 апреля 2011

В ответ на ваш запрос сделать это без передачи переменной, см. Ниже. Недостатком является то, что <xsl:number> нельзя использовать непосредственно в шаблоне значений атрибутов (поскольку @Martin использовал переменную $id), поэтому создание атрибута id становится многословным.

<xsl:template match="A">
  <Person>
    <xsl:attribute name="id">
      <xsl:number count="A" />
    </xsl:attribute>
    <xsl:apply-templates select="a" />
  </Person>
</xsl:template>

<xsl:template match="a">
  <Item>
    <xsl:attribute name="id"> <!-- I would name it personRef or something -->
      <xsl:number count="A" />
    </xsl:attribute>
  </Item>
</xsl:template>

(непроверенная). Ключ здесь использует select=".." на xsl:number в шаблоне "a". Редактировать: Оказывается, что select=".." на самом деле не является необходимым. Поскольку узел контекста a не соответствует шаблону подсчета A, он начинается с ближайшего предка, который ему соответствует. Какая сеть полезных значений по умолчанию эта инструкция имеет!

1 голос
/ 21 апреля 2011

ОК, у меня есть ответ. Однако я отметил ответ Ларса как решение.

<xsl:template match "A">
<xsl:element name="Person">
<xsl:attribute name="id">
<xsl:number count="A"/>
<xsl:apply-templates select="a"/>
</xsl:attribute>
</xsl:element>
</xsl>
<xsl:template match "a">
<xsl:element name="Item">
<xsl:attribute name="id">
<xsl:number count="A" level="any"/>
</xsl:attribute>
</xsl:element>
</xsl>

Достаточно было добавить атрибут level="any".

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