2010-10-21 5 views
0

У меня есть * .xml с элементами, такими как:XSLT копирование без XSL: копирование из

<app-method name="leave-accrual-status-details" kind="enquiry"> 
    <title>...</title> 
    <required-roles> 
     <role name="authenticated"/> 
    </required-roles> 
    <asd> 
     <param name="..." datatype="dt:int" control="hidden" call-kind="..." data-kind="..."/> 
    </asd> 
    <data-engine sp="spLeaveAccrualStatusDetails"> 
    ... 
    </data-engine> 
    <wia> 
    ... 
    </wia> 
    </app-method> 

и генерируя новый .xml-документ (выбор только элементы "приложение-метод") .I делаю это следующим образом: ( .xsl)

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt"> 
    <xsl:output method="xml" encoding="utf-8" indent="no"></xsl:output> 

    <xsl:template match="/"> 
    <xsl:for-each select="//app-method"> 
    <xsl:if test='./required-roles/role[@name="administrator"]'> 
    <xsl:copy-of select="." /> 
    </xsl:if> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

Это прекрасно работает, но .. есть ли способ сделать это без „XSL: копия-of“? Думаю, мне нужно использовать что-то вроде «node-name ('blabla')» и value-of? .. И как выбрать набор параметров методов (отчетливо)? (Пары имя = «имя параметр»), да, мне нужно использовать «ключ», но не могу найти хорошие образцы с ним

Большого спасибо

PS При преобразовании xml-> XML я должен использовать Far («xsl in.xml transform.xsl out.xml»), потому что есть некоторая странная ошибка при попытке сделать это из cdm.exe, мне немного не нравится FAR, есть ли другой способ конвертировать xmls?

+0

Существует так много вопросов здесь ... Ja! – 2010-10-21 13:41:29

ответ

1

Distinct

<xsl:key name="pkey" match="param" use="@name"/> 

    <xsl:template match="/"> 
     <xsl:for-each select='//app-method/asd/param[generate-id() = generate-id(key("pkey", @name)[1])]'> 
      <parameter> 
      <xsl:value-of select="@name"/> 
      </parameter> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

Уникального

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:key name="pkey" match="@name" use="."/> 

    <xsl:template match="/"> 
     <xsl:for-each select="//app-method/asd"> 
      <xsl:copy-of select='param[@name[generate-id() = generate-id(key("pkey",.)[1])]]'/> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

Использования cmd.exe для преобразования XML: скачать MSXSL.exe (новый) поместить его в какой-нибудь папке системы (что уже есть включается в переменную пути) , а затем из командной строки msxsl source.xml transformer.xsl -o result.xml

Напишу завтра о копировании без «копирования из»

BTW: хорошее Tutorial

+0

Что вы подразумеваете под различием между Distinct и Unique?Разве ваши фрагменты кода не делают то же самое, кроме разницы выходного формата, ' foo' vs.' ... '? – LarsH

2

Это прекрасно работает, но .. Есть ли способ сделать это без «XSL: копирование из»? Подумайте, что нужно использовать что-то вроде «имя-узла („BlaBla“)» и стоимость от? ..

Читайте о <xsl:element> инструкции, а также о identity rule.

.. И как выбрать набор методов параметров (разн.)? (Пары имени = «имя параметр»), да мне нужно использовать «ключ», но не могу найти хорошие образцы с ним

Это второй вопрос (из трех) и сильно отличается от первый. Читайте перевод информации о Muenchian grouping. И спросите его как отдельный вопрос.

+0

Спасибо, я уже сделал отличный, это было довольно легко –

+0

Теперь читаем о и

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