2015-11-29 3 views
0

Я пишу 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 для своих тестов.

Ваша помощь очень ценится.

+0

Вы злоупотребляете квадратные скобки. –

ответ

0

Я хотел бы предложить вам попробовать это так:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[starts-with(@name, '-')]"> 
    <xsl:attribute name="{substring(@name, 2)}"> 
     <xsl:value-of select="."/> 
    </xsl:attribute>  
</xsl:template> 

</xsl:stylesheet> 

Тест: http://xsltransform.net/6r5Gh3g

Обратите внимание, что это не сработает, если эти "особые" элементы не являются первыми обрабатываться: http://xsltransform.net/6r5Gh3g/1 Если это возможно, вы также должны соответствовать родительскому элементу и управлять порядком обработки оттуда:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[starts-with(@name, '-')]"> 
    <xsl:attribute name="{substring(@name, 2)}"> 
     <xsl:value-of select="."/> 
    </xsl:attribute>  
</xsl:template> 

<xsl:template match="*[*[starts-with(@name, '-')]]"> 
    <xsl:copy> 
     <xsl:apply-templates select="*[starts-with(@name, '-')]"/> 
     <xsl:apply-templates select="@*|node()[not(starts-with(@name, '-'))]"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

http://xsltransform.net/6r5Gh3g/3

+0

Спасибо, но я хочу, чтобы строка длиной хорошо работала внутри подстроки. Как я могу сделать эту работу? : dotaneli

+0

@dotaneli Нет необходимости использовать 'string-length() здесь. См. Определение функции substring(): http://www.w3.org/TR/xpath/#function-substring –

+0

Спасибо, вы, конечно, правы. Но если я так понимаю: , я получаю это от XMLSPY: XSLT 2.0 Debugging Error: Недопустимое имя атрибута. Текущий узел XML - это 'http://www.google.com'. – dotaneli

Смежные вопросы