2015-12-17 3 views
0

Меня спрашивали, есть ли способ сопоставить данный узел на основе индекса именованного узла? Вот пример:xml - XSLT Как совместить узел с индексом другого узла

<RecordSets> <RecordSet RecordSetId="Events"> <Columns> <Col Name="a" Type="Free" /> <Col Name="b" Type="Free" /> <Col Name="c" Type="Free" /> <Col Name="d" Type="Free" /> <Col Name="e" Type="Free" /> </Columns> <Rows>
<Row> <Col>1</Col> <Col>2</Col> <Col>3</Col> <Col>4</Col> <Col>5</Col> </Row>
<Row> <Col/> <Col/> <Col/> <Col/> <Col /> </Row>
</Rows> </RecordSet> </RecordSets>

Так что в этом случае я хочу, чтобы иметь возможность выбрать индекс сказать <Col Name="e" Type="Free" /> и использовать этот индекс, чтобы соответствовать шаблон <Col>5</Col>

Я действительно изо всех сил, чтобы достичь это. Лучшее, что я смог придумать до сих пор есть:

<xsl:template match="Col[position() = last()" mode="RSLCell">

Который дал мой упрощенный пример «работает», но позиция, которая должна быть выбрана не всегда будет последним. Любые идеи получили высокую оценку. Благодаря!

EDIT некоторые уточнения: У меня есть шаблон со следующим форматом. Из-за ограничений в бизнесе я могу только реально изменить внутренности шаблона. Мы используем XSLT v1.

<xsl:template match="Col[position() = last()]">  
    <!-- This will be a serialized CaseEventAction collection, get a new document and match the events--> 
    <xsl:variable name="document" select="extensions:XmlDataItemValueAsNodeSet(text())"/>  
    <td> 
     <xsl:apply-templates select="$document/applyAnotherTemplate" /> 
    </td> 

Как вы можете видеть, это работает только в силу этого пункта в вопросе, находящегося в последней позиции(). Это уже не так, и теперь нам нужно сопоставить тег <col> с тем же номером/индексом в теге <col Name="e"... />.

+0

Вы пытаетесь выбрать значение только в определенном столбце (по имени)? Если да, из каких строк/строк? Пожалуйста, опубликуйте ожидаемый результат преобразования (всего). –

+0

Я пытаюсь сопоставить шаблон с 5-й() записи в ; используя индекс . Шаблон форматирует содержимое перед тем, как применить к нему еще один шаблон. Извините, если я не очень ясен. Моя подверженность xsl довольно минимальна. – user1829988

+0

Это не отвечает на мой вопрос - что касается не XSLT, а вашей общей цели. Что здесь дается, и каков ожидаемый результат? - Также укажите, используете ли XSLT 1.0 или 2.0. –

ответ

0

Вы можете использовать позиционный предикат в виде <xsl:template match="Row/Col[position() = count(/RecordsSets/RecordSet[@RecordSetId = 'Events']/Columns/Col[@Name = 'e']/preceding-sibling::Col) + 1]"/>.