У меня есть XML-документ, в котором есть узлы, которые выглядят так:
<Variable name="var1" dataType="INT32"/>
<Variable name="var2" dataType="INT16"/>
<Variable name="var3" dataType="INT8"/>
Я могу циклически перебирать переменные и отображать имя и тип данных просто отлично, но я хотел бы отобразитьразмер переменной, а также ее смещение (первая переменная имеет смещение нуля, 2-я имеет смещение, равное размеру первой, 3-я имеет смещение, равное размеру двух предыдущих).В приведенном выше примере var1 имеет размер 4 и смещение нуля, var2 имеет размер 2 и смещение 4, var3 имеет размер 1 и смещение 6.
Для печатиразмер, это сработало:
<xsl:variable name="fieldSize">
<xsl:choose>
<xsl:when test="contains(@dataType, 'INT8')">
<xsl:value-of select="'1'"/>
</xsl:when>
<xsl:when test="contains(@dataType, 'INT16')">
<xsl:value-of select="'2'"/>
</xsl:when>
<xsl:when test="contains(@dataType, 'INT32')">
<xsl:value-of select="'4'"/>
</xsl:when>
<xsl:otherwise><xsl:value-of select="'unknown'"/></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select="$fieldSize"/>
Однако я понятия не имею, как распечатать смещение!Если бы размер поля был атрибутом, я мог бы сделать что-то вроде:
<xsl:variable name="offset" select="sum(preceding-sibling::Variable/@fieldSize)"/>
Поскольку это переменная, а не атрибут, я не могу сделать сумму по сравнению с предыдущими братьями и сестрами для вычисления смещения.Моя следующая идея - попытаться создать выражение, которое может соответствовать размеру на основе атрибута @dataType, и, возможно, я смогу передать это в выражение "sum ()" (хотя и не знаю, сработает ли это).
Я попытался создать NodeSet для fieldSizes, чтобы я мог найти размер по атрибуту:
<xsl:variable name="fieldSizes">
<i ref="INT8">1</i>
<i ref="INT16">2</i>
<i ref="INT32">4</i>
</xsl:variable>
<xsl:value-of select="$fieldSizes[@ref=@dataType]"/>
Однако последняя строка вызывает ошибку во время преобразования XSLT: XPathОжидалось, что выражение вернет NodeSet. Все приведенные ниже варианты вызывают одну и ту же ошибку:
<xsl:value-of select="$fieldSizes[@ref='INT8']"/>
<xsl:value-of select="$fieldSizes[@ref=INT8]"/>
<xsl:value-of select="$fieldSizes[1]"/>
Как вывести размер поля переменной на основе ее dataType?И как только это сработает, как я могу рассчитать значение смещения?Возможно что-то вроде:
<xsl:variable name="offset" select="sum(preceding-sibling::Variable/$fieldSizes[@ref=@dataType])"/>