Значение приращения в XSLT - PullRequest
0 голосов
/ 14 октября 2019

Я хочу увеличить значение в XSLT.

Ввод:

<table>
  <tr>
    <td>315</td>
    <td>abc</td>
  </tr>
  <tr>
    <td>315</td>
    <td>def</td>
  </tr>
  <tr>
    <td>315</td>
    <td>ghi</td>
  </tr>
</table>

Вывод должен быть:

<context id="001" type="abc">
    <image ref="../../../Images/Wind_1.eps"/>
<context>
<tps:context id="002" type="def">
    <image ref="../../../Images/Wind_1.eps"/>
</tps:context>
<context id="003" type="ghi">
    <image ref="../../../Images/Wind_1.eps"/>
<context>

Пробный код:

<xsl:template match="tr">
    <xsl:for-each select=".">
        <tps:context id="{ancestor::table/tr/position()}" type="{translate(td[2],' ','')}">
            <tps:image>
                <xsl:value-of select"'../../../Images/Wind_1.eps'"/>
            </tps:image>
        </tps:context>
    </xsl:for-each>
</xsl:template>

Мой вывод не работает хорошо. Я получаю @ id = "1 2 3". Я использую XSLT 2.0

1 Ответ

0 голосов
/ 14 октября 2019

Ваше текущее выражение получает позицию всех элементов tr (поскольку ось предка относится только к элементу table).

Если вы хотите указать позицию родителя tr, возможно,Проще всего установить переменную, содержащую позицию перед xsl:for-each, например:

<xsl:template match="tr">
    <xsl:variable name="pos" select="position()" />
    <xsl:for-each select=".">
        <tps:context id="{$pos}" type="{translate(td[2],' ','')}">
            <tps:image>
                <xsl:value-of select="'../../../Images/Wind_1.eps'"/>
            </tps:image>
        </tps:context>
    </xsl:for-each>
</xsl:template>

Это предполагает, что вы зачистите пробел с помощью xsl:strip-space или выполните <xsl:apply-templates select="tr />", чтобыИзбегайте включения пробельных узлов в число. Если вы не удаляете пробелы и выполняете команду <xsl:apply-templates /> при размещении на родительском элементе table, тогда будут выделяться пробельные текстовые узлы между элементами tr, и это влияет на результат функции position().

В качестве альтернативы, измените переменную на:

<xsl:variable name="pos">
    <xsl:number />
</xsl:variable>

Сказав это, я не уверен в необходимости xsl:for-each select".". Вы можете просто сделать это (опять же с предположением, что пробелы были удалены).

<xsl:template match="tr">
    <tps:context id="{position()}" type="{translate(td[2],' ','')}">
        <tps:image>
            <xsl:value-of select="'../../../Images/Wind_1.eps'"/>
        </tps:image>
    </tps:context>
</xsl:template>

См. Это в действии на http://xsltfiddle.liberty -development.net / bFWR5DX (обратите внимание на использованиеxsl:strip-space в XSLT).

Или, если вы не удаляете пробелы, сделайте это

<xsl:template match="tr">
  <xsl:variable name="pos">
    <xsl:number />
  </xsl:variable>
  <tps:context id="{$pos}" type="{translate(td[2],' ','')}">
    <tps:image>
      <xsl:value-of select="'../../../Images/Wind_1.eps'"/>
    </tps:image>
  </tps:context>
</xsl:template>

См. это в действии на http://xsltfiddle.liberty -развитии. нетто / bFWR5DX / 1

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