2014-11-10 2 views
0

У меня есть пример XML-файл:XSL копия, если атрибут текущего узла равен приписывать другой узел

<?xml version="1.0" encoding="UTF-8"?> 
<XML> 
    <MetaData> 
     <Ref MDID='ID'></Ref> 
    </MetaData> 
    <MetaData2> 
     <Ref MDID='ID2'></Ref> 
    </MetaData2> 
    <Items ID='ID'> 
     <Item OID='haveit'></Item> 
     <Item OID='ornot'></Item> 
    </Items> 
    <Items ID= ID2'> 
     <Item OID='ornot'></Item> 
     <Item OID='ornot'></Item> 
    </Items> 
</XML> 

я должен преобразовать его так, что я получаю следующий результат.

<?xml version="1.0" encoding="UTF-8"?> 
<XML> 
    <MetaData> 
     <Ref MDID='ID'></Ref> 
    </MetaData> 
    <Items ID='ID'> 
     <Item OID='haveit'></Item> 
    </Items> 
</XML> 

Так что сначала я должен проверить, существует ли элемент 'hasit'. Затем я копирую соответствующий родительский элемент «Item». Затем мне нужно скопировать MetaData где MDID равна Items ID (в данном случае «ID», но я не знаю точное значение в моем реальном примере) То, что я до сих пор:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.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="*" /> 
    <xsl:variable name="Item" select = "'haveit'"/> 
    <xsl:template match="XML"> 
     <xsl:copy> 
      <xsl:apply-templates /> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Items"> 
     <xsl:if test="child::Item[@OID = $Item]"> 
      <xsl:copy> 
       <xsl:copy-of select="@*" /> <!-- copy attributes -->            
      </xsl:copy>    
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

С помощью этого кода я могу скопировать элемент, который я хочу, и соответствующий элемент элементов. Теперь я не знаю, как получить правильный элемент MetaData. Как проверить, имеет ли MDID Ref значение такое же значение, что и ID элемента?

+0

Действительно ли элементы, названные '' MetaData' и MetaData2'? –

+0

Используете ли вы процессор XSLT 1.0 или 2.0? –

+0

Я использую XSLT 2.0. Да, это всего лишь пример реальных данных, которые у меня есть, но да, это выглядит так! –

ответ

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="*"/> 

<xsl:param name="oid" select="'haveit'"/> 

<xsl:key name="meta" match="*" use="Ref/@MDID" /> 

<xsl:template match="/XML"> 
    <xsl:variable name="matching-items" select="Items[Item/@OID=$oid]" /> 
    <xsl:copy> 
     <xsl:copy-of select="key('meta', $matching-items/@ID)"/> 
     <xsl:apply-templates select="$matching-items"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Items"> 
    <xsl:copy> 
     <xsl:copy-of select="@*" /> 
     <xsl:copy-of select="Item[@OID=$oid]" />           
    </xsl:copy> 
</xsl:template>  

</xsl:stylesheet> 
+0

спасибо, что это работает, но теперь порядок элементов не то же самое, могу ли я предопределить заказ? –

+0

@ user3891252 Просто переключите их: do '' before ''. –

+0

ok Большое спасибо, еще один вопрос, как я могу сделать эту работу, если в есть еще один элемент' hasit '(так что метаданные с идентификатором MDID' ID2 'тоже скопированы? –