2013-11-07 2 views
1

У меня есть два XSL переменные, которые держат данные как этого Первого один itemsRe-Order XML-данные относительно другого XML с помощью XSLT

<values> 
    <value> 
    12635 
    </value> 
    <value> 
    SD20 
    </value> 
    <value> 
    2404 
    </value> 
    <value> 
    3586877 
    </value> 
</values> 

второго один syddata

<syddata lastUpdated="07.11.2013 11:06 "> 
    <data Varenummer="3586877" Varenavn="Liqudffid s" Brand="Georg Jensen" ></data> 
    <data Varenummer="12635" Varenavn="tesr" Brand="Kähcddler" ></data> 
    <data Varenummer="2404" Varenavn="uhjy" Brand="Pitcfrhstone" ></data> 
    <data Varenummer="SD20" Varenavn="sfggh" Brand="dghgh" ></data> 
</syddata> 

Я хочу заказывайте syddata в соответствии с заказом от items ..means value Поле в items такие же, как Varenummer Поле в syddata .Я хочу о использовать это в качестве ключа и сортировки syddata ожидается выход будет как этот

<syddata lastUpdated="07.11.2013 11:06 "> 
    <data Varenummer="12635" Varenavn="tesr" Brand="Kähcddler" ></data> 
    <data Varenummer="SD20" Varenavn="sfggh" Brand="dghgh" ></data> 
    <data Varenummer="2404" Varenavn="uhjy" Brand="Pitcfrhstone" ></data> 
    <data Varenummer="3586877" Varenavn="Liqudffid s" Brand="Georg Jensen" ></data> 
</syddata>   

я добавил всю свою XSLT сюда, чтобы узнать, как рабочий процесс

<xsl:stylesheet 
    version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxml="urn:schemas-microsoft-com:xslt" 
    xmlns:XSLTHelper="urn:XSLTHelper" 
    xmlns:exslt="http://exslt.org/common" 
    xmlns:umbraco.library="urn:umbraco.library" xmlns:Exslt.ExsltCommon="urn:Exslt.ExsltCommon" 
    exclude-result-prefixes=" msxsl msxml "> 
    <xsl:output method="html" omit-xml-declaration="yes"/> 
    <xsl:param name="currentPage"/> 
    <xsl:template match="/"> 
     <xsl:variable name="items" select="umbraco.library:Split($textWithPipes, '|')"/> 
     <xsl:variable name="syddata" select="XSLTHelper:GenerateData($productids)"/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Является ли это XSLT 1,0 или 2,0? У вас есть 'version =" 2.0 "' в таблице стилей, но также объявления пространств имен exslt и msxsl, которые предполагают, что процессор действительно 1.0? –

+0

@ IanRoberts извините за это. XSLT 2.0 – Athul

+0

@IanRoberts, оставляющий реальный случай за секунду. Скажите, как мне нужно выяснить, что такое мой XSLT-процессор .. Просто используя cms umbraco .... или какие-либо ресурсы, где я могу смотреть на основные детали, такие как – Athul

ответ

2

Для эффективность Я хотел бы начать с определением ключом (вне любой <xsl:template>)

<xsl:key name="dataByNummer" match="data" use="@Varenummer" /> 

и затем основного шаблона мог быть просто

<xsl:template match="/"> 
    <xsl:variable name="items" select="umbraco.library:Split($textWithPipes, '|')"/> 
    <xsl:variable name="syddata" select="XSLTHelper:GenerateData($productids)"/> 

    <xsl:element name="{name($syddata/*)}"> 
     <!-- copy attributes --> 
     <xsl:sequence select="$syddata/*/@*" /> 
     <!-- copy data in the right order --> 
     <xsl:sequence select=" 
      for $id in $items//value 
      return key('dataByNummer', normalize-space($id), $syddata)" /> 
    </xsl:element> 
</xsl:template> 

Если бы XSLT 1.0, было бы немного более неудобный, потому что вы не имеете for выражения в XPath 1.0 и функции XSLT 1.0 key не имеет третий параметр. Но он все еще может быть сделан аналогичным образом при использовании вложенных for-each тегов и дополнительных переменных

<xsl:template match="/"> 
    <xsl:variable name="items" select="umbraco.library:Split($textWithPipes, '|')"/> 
    <xsl:variable name="syddata" select="XSLTHelper:GenerateData($productids)"/> 

    <xsl:element name="{name($syddata/*)}"> 
     <!-- copy attributes --> 
     <xsl:copy-of select="$syddata/*/@*" /> 
     <!-- copy data in the right order --> 
     <xsl:for-each select="$items//value"> 
     <xsl:variable name="curValue" select="." /> 
     <xsl:for-each select="$syddata"><!-- switch focus for the key function --> 
      <xsl:copy-of select="key('dataByNummer', normalize-space($curValue))" /> 
     </xsl:for-each> 
     </xsl:for-each> 
    </xsl:element> 
</xsl:template> 

Внутренний for-each только одна итерации, но дело в том, чтобы переключить «текущий документ» в $syddata так что key функция выглядит up data элементов в этом, а не в $items.

2

Вы можете отсортировать в XSLT 2.0:

<xsl:stylesheet 
    version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxml="urn:schemas-microsoft-com:xslt" 
    xmlns:XSLTHelper="urn:XSLTHelper" 
    xmlns:exslt="http://exslt.org/common" 
    xmlns:umbraco.library="urn:umbraco.library" xmlns:Exslt.ExsltCommon="urn:Exslt.ExsltCommon" 
    exclude-result-prefixes=" msxml "> 
    <xsl:output method="html" omit-xml-declaration="yes"/> 
    <xsl:param name="currentPage"/> 
    <xsl:template match="/"> 
     <xsl:variable name="items" select="umbraco.library:Split($textWithPipes, '|')"/> 
     <xsl:variable name="syddata" select="XSLTHelper:GenerateData($productids)"/> 

     <xsl:variable name="sorted"> 
      <xsl:apply-templates select="$syddata" mode="sort"> 
      <xsl:with-param name="values" select="$items/values/value/normalize-space()"/> 
      </xsl:apply-templates> 
     </xsl:variable> 
     <xsl:copy-of select="$sorted"/> 
    </xsl:template> 

    <xsl:template match="syddata" mode="sort"> 
    <xsl:param name="values"/> 
    <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:perform-sort select="data"> 
     <xsl:sort select="index-of($values, @Varenummer)"/> 
     </xsl:perform-sort> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Я получаю эту ошибку, когда пытаюсь сохранить код. xmlns: xsl = "http://www.w3.org/1999/XSL/Transform" имеет недопустимый дочерний элемент perform-sort .. – Athul

+0

@AKS означает, что ваш процессор фактически XSLT 1.0, а не 2.0. –

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