2014-01-23 5 views
1

Я сделал переменную в XSLT, и я пытаюсь прочитать значение из элемента внутри переменной. Я получаю следующее сообщение об ошибке в Visual Studio при попытке отладки:XSLT: Как получить значение из определенного элемента внутри переменной?

«Для того, чтобы использовать фрагмент результирующего дерева в выражении пути, сначала преобразовать его к узлу набора, используя mxsxl: набор узлов() функция».

Как я понимаю, mssxl не является «реальной» функцией xslt и может не работать в некоторых системах; поэтому я не хочу его использовать.

Как получить значение из определенного элемента, который находится в переменной XSLT?

Вот мой код.

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >  

    <xsl:variable name ="TestVariable"> 
     <video id ="0">foo1</video> 
     <video id ="2">foo2</video> 
     <video id ="3">foo3</video> 
     <video id ="4">foo4</video> 
     <video id ="5">foo5</video> 
     <video id ="6">foo6</video> 
    </xsl:variable> 

    <xsl:template match="/"> 
    <outofloop> 
     <a2> 
     <xsl:value-of select="$TestVariable/video[@id='6']" /> 
     </a2> 
    </outofloop> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Вы XSLT недействителен: '' не соответствует '' тег (как и другие). '' не закрыт –

+0

Вы посмотрели на них? http://stackoverflow.com/questions/9907302/storing-html-tags-within-an-xsl-varable http://stackoverflow.com/questions/13200567/can-we-insert-html-tags-in- xsl-variable –

ответ

1
<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 


    <xsl:variable name ="TestVariable"> 
     <video1 id ="0">foo1</video1> 
     <video2 id ="2">foo2</video2> 
     <video3 id ="3">foo3</video3> 
     <video4 id ="4">foo4</video4> 
     <video5 id ="5">foo5</video5> 
     <video6 id ="6">foo6</video6> 
    </xsl:variable> 

    <xsl:template match="/"> 
     <outofloop> 
      <a2> 
       <xsl:value-of select="$TestVariable/video6/node()" /> 
      </a2> 
     </outofloop> 
    </xsl:template> 
</xsl:stylesheet> 

output-

<outofloop><a2>foo6</a2></outofloop> 
+0

Если я попытаюсь это сделать, он даст мне выражение, которое должно оцениваться в наборе узлов. –

2

XSLT вы должны были бы работать в XSLT 2.0.

Вопрос заключается в том, что в XSLT 1.0, ваш TestVariable переменная содержит то, что известно как «Result Tree Фрагмент», и поэтому XSLT не может получить доступ к этому, поскольку это действительно требует множества узлов. Вы можете преобразовать его в набор узлов с помощью функции расширения. Действительно, эта функция с пользой называется node-set.

Таким образом, вы могли бы сделать это

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ms="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="ms"> 

    <xsl:variable name ="TestVariable"> 
     <video id ="0">foo1</video> 
     <video id ="2">foo2</video> 
     <video id ="3">foo3</video> 
     <video id ="4">foo4</video> 
     <video id ="5">foo5</video> 
     <video id ="6">foo6</video> 
    </xsl:variable> 

    <xsl:template match="/"> 
    <outofloop> 
     <a2> 
     <xsl:value-of select="ms:node-set($TestVariable)/video[@id='6']" /> 
     </a2> 
    </outofloop> 
    </xsl:template> 
</xsl:stylesheet> 

Но, как вы отмечаете, это приведет к ограничению его портативность.

Существует еще один способ, и это должно использовать функцию , чтобы позволить XSLT ссылаться на себя как на входной документ. Просто определите переменную как так

<xsl:variable name="Test" select="document('')//xsl:variable[@name='TestVariable']" /> 

Затем вы можете сделать это

<xsl:value-of select="$Test/video[@id='6']" /> 

Потому что тест относится к входному документу, теперь он держит набор узлов непосредственно, поэтому никакая функция расширения не требуется ,

Попробуйте XSLT слишком

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:variable name ="TestVariable"> 
     <video id ="0">foo1</video> 
     <video id ="2">foo2</video> 
     <video id ="3">foo3</video> 
     <video id ="4">foo4</video> 
     <video id ="5">foo5</video> 
     <video id ="6">foo6</video> 
    </xsl:variable> 

    <xsl:variable name="Test" select="document('')//xsl:variable[@name='TestVariable']" /> 

    <xsl:template match="/"> 
    <outofloop> 
     <a2> 
     <xsl:value-of select="$Test/video[@id='6']" /> 
     </a2> 
    </outofloop> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Не выводит ожидаемый 'foo6', когда я использую его в .NET с помощью' System.Xml.Xsl.XslTransform.Transform() '. Он должен работать с любым хорошо сформированным входным файлом, не так ли? Ошибка .NET? Что вы используете для трансформации? –

+0

Возможно, функция «document()» должна быть включена в .net. См. Http://msdn.microsoft.com/en-us/library/system.xml.xsl.xsltsettings.enabledocumentfunction (v = vs.110) .aspx –

+0

Хорошо, мне кажется, что я должен использовать 'XslCompiledTransform' вместо' XslTransform' для применения этих настроек. Благодарю. –

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