Я пишу XSLT, который, среди прочего, находит определенные элементы с атрибутом «name» со значением, которое начинается с тире ('-') , Когда такой атрибут найден, xslt создает атрибут xsl:, который является всем текстом, который появляется после тире атрибута name.Настройка имени атрибута в соответствии с подстрокой атрибута другого элемента
Так, например, предположим, что у меня есть следующий фрагмент XML:
<someelement>
<json:string name="-style">display: block; white-space: pre; border: 2px
solid #c77; padding: 0 1em 0 1em; margin: 1em;
background-color: #fdd; color: black</json:string>
[... some extra elements here ...]
</someelement>
И я хочу, чтобы он стал
<someelement style="display: block; white-space: pre; border: 2px solid #c77;
padding: 0 1em 0 1em; margin: 1em; background-color: #fdd;
color: black">
[... some extra elements here ...]
</someelement>
CurrentY, я пытаюсь несколько вариаций на следующий XSLT:
<!-- Match string|number|boolean|null elements with a "name" attribute -->
<xsl:template match="json:string[@name] | json:number[@name] | json:boolean[@name] | json:null[@name]">
<xsl:choose>
<xsl:when test="starts-with(@name,'-')">
<xsl:attribute name="{substring(./[@name],2,string-length(./@name) - 1)}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:element name="{@name}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
А конкретно, это линия, которая озадачивает меня:
<xsl:attribute name="{substring(./[@name],2,string-length(./@name) - 1)}">
Чтобы быть более конкретным, часть в нем, которая не работает, является частью длины строки. Если я заменил всю длину строки длиной на число, скажем, 2, она работает нормально.
И да, я знаю, что подстрока-после меня будет лучше. я сделал попробовать следующее, но он не работает либо:
<xsl:attribute name="{substring-after(./[@name],'-')}">
Я уверен, что это какое-то синтаксическая ошибка.
P.S. - Я использую XMLSPY для своих тестов.
Ваша помощь очень ценится.
Вы злоупотребляете квадратные скобки. –