2014-10-28 4 views
0

Я нобе, когда дело доходит до программирования с помощью xpath или xslt. Я пытаюсь выбрать только указанный узел для обработки и в процессе создания папок для каждого элемента. Вот мой тест XML им работать:Выберите только один обрабатываемый узел

XML:

<Sandbox> 
    <Unknow name="Unknow"> 
    <Property name="unknow" value="unknow"/> 
    </Unknow> 
    <View name="Object"> 
    <Element name="first" value="1"> 
     <Property name="great" value="10"/> 
     <Element name="detail" value="3"> 
      <Property name="shiny" value="30"/> 
      <Element name="doNot" value="0"> 
       <Property name="non" value="0"/> 
      </Element> 
     </Element> 
    </Element> 
</View> 
<View name="OtherObject"> 
    <Element name="second" value="2"> 
     <Property name="greater" value="20"/> 
     <Element name="detail" value="4"> 
      <Property name="dark" value="40"/> 
      <Element name="doNot" value="0"> 
       <Property name="non" value="0"/> 
      </Element> 
     </Element> 
    </Element> 
    </View> 
</Sandbox> 

XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:strip-space elements="*"/> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:template match="Sandbox/View[@name='OtherObject']"> 
    <xsl:apply-templates select="//Element"/> 
</xsl:template> 
<xsl:template match="Element"> 
    <xsl:result-document href="{string-join(ancestor-or-self::Element,'/')}/{concat(@name,'_',position())}.xml"> 
     <item> 
      <xsl:copy-of select="."/> 
     </item> 
    </xsl:result-document> 
</xsl:template> 

Выход я хочу иметь это структура папок/Объект/первый/деталь. Что я делаю не так? Я получаю сообщение об ошибке, что я не могу создать выходной файл. У вас есть какие-либо советы по xpath, потому что я предполагаю, что мой xpath не делает этого правильно. Благодаря

+0

В ваш путь не входит «doNot» (один из элементов «@name»). Вы хотите его исключить? Кроме того, ваш первый шаблон имеет «OtherObject» как @name .., но путь к папке, который вы хотите, имеет «Object». Какой узел вы хотите обработать? –

ответ

0

Для

<xsl:template match="Sandbox/View[@name='OtherObject']"> 
    <xsl:apply-templates select="//Element"/> 
</xsl:template> 

вы, вероятно, хотите

<xsl:template match="/"> 
    <xsl:apply-templates select="Sandbox/View[@name='OtherObject']//Element"/> 
</xsl:template> 

Что касается <xsl:result-document href="{string-join(ancestor-or-self::Element,'/')}/{concat(@name,'_',position())}.xml">, пожалуйста, напишите точное сообщение об ошибке и сообщить нам, какие имена папок и какие имена файлов вы хотите построить.

<xsl:result-document href="{string-join(ancestor-or-self::Element,'/')}/{concat(@name,'_',position())}.xml"> 
+0

Считаете ли вы возможным сохранение 'href' переменной? – Artiom

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