xslt 1.0 переписать значения узла в соответствии с картой - PullRequest
0 голосов
/ 13 января 2012

При преобразовании документа мне нужно «найти» определенное содержимое узла в «карте» и записать эти значения.

Я добавил свою «карту» в преобразование.

<xsl:variable name="inlinedmap">
    <kat id="stuff">value</kat>
    <!-- ... -->
</xsl:variable>
<xsl:variable name="map" select="document('')/xsl:stylesheet/xsl:variable[@name='inlinedmap']" />
<xsl:template match="/">
    <xsl:for-each select="/*/foo">
        <!-- 'bar' contents should equal to contents of 'kat' -->
        <xsl:variable name="g" select="$map/key[.=bar]"/>
        <xsl:choose>
            <xsl:when test="$g != ''">
                <xsl:value-of select="$g/@id"/>
            </xsl:when>
            <xsl:otherwise>
                ERROR
            </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each>
</xsl:template>

Я всегда получаю значение ОШИБКИ.Я не могу поместить значения карт в атрибуты, потому что они содержат экранированные буквы.

Как я могу заставить это работать?

1 Ответ

1 голос
/ 13 января 2012

Я думаю, здесь есть несколько проблем:

  • Вы, похоже, ищете key элементов в вашей переменной, но они там называются kat (опечатка?)
  • Кажется, вы пытаетесь сослаться на bar дочерний узел контекста внутри цикла, но вам нужно использовать current(), чтобы сделать это
  • Вы должны создать эту карту как элементы в вашем собственном пространстве имен вместо xsl:variable

Вот полный пример. Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:my="my">
    <my:vars>
        <kat id="stuff">value</kat>
        <!-- ... -->
    </my:vars>
    <xsl:variable name="map" select="document('')/*/my:vars/*"/>
    <xsl:template match="/">
        <xsl:for-each select="/*/foo">
            <!-- 'bar' contents should equal to contents of 'kat' -->
            <xsl:variable name="g" select="$map[.=current()/bar]"/>
            <xsl:choose>
                <xsl:when test="$g != ''">
                    <xsl:value-of select="$g/@id"/>
                </xsl:when>
                <xsl:otherwise>
                    ERROR
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Применяется к этому входу:

<root>
    <foo><bar>value</bar></foo>
    <foo><bar>value1</bar></foo>
    <foo><bar>value2</bar></foo>
    <foo><bar>value3</bar></foo>
</root>

Производит этот вывод (одно совпадение):

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