2015-06-18 15 views
0

У меня есть XML ниже.XSL - копировать элемент с атрибутом и исключать отдельные дочерние элементы

<rootElement rootAttribute1="value1" rootAttribute2="value2"> 
    <childElement childElementAttribute="value"> 
     <grandChild>First</grandChild> 
    </childElement> 
    <childElement childElementAttribute="copyMe"> 
     <grandChild>Second</grandChild> 
    </childElement> 
    <childElement childElementAttribute="value"> 
     <grandChild>Third</grandChild> 
    </childElement> 
</rootElement> 

И мне нужно обработать его с помощью XSL, применяя следующие reules: 1. RootElement элемент должен быть скопирован со всеми его атрибуты 2. RootElement элемент, который только что был скопирован, должен содержать только те элементы, которые имеют childElement childElementAttribute = "copyMe" (строка для сравнения «copyMe» только в этом случае, но она генерируется динамически) (со всеми их атрибутами). «copyMe» здесь только конкретное значение, но Таким образом, описанный в примере выше, должны быть преобразованы в следующий один

<rootElement rootAttribute1="value1" rootAttribute2="value2"> 
    <childElement childElementAttribute="copyMe"> 
     <grandChild>Second</grandChild> 
    </childElement> 
</rootElement> 

Вот XSL я попытался

<!-- Copy rootElement element--> 
<xsl:template match="node()|@*" mode="copyAndExclude"> 
    <xsl:param name="requiredAttrivuteValue"/> 
    <xsl:if test="childElement[@childElementAttribute=$requiredAttrivuteValue]" > 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*" mode="excludeUnnecessaryChilds" /> 
     </xsl:copy> 
    </xsl:if> 
</xsl:template> 

<!-- exclude unnecessary child elements--> 
<xsl:template match="node()|@*" mode="excludeUnnecessaryChilds"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*" mode="excludeUnnecessaryChilds" /> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="/"> 
    .... 
    <xsl:apply-templates select="rootElement" mode="copyAndExclude" > 
     <xsl:with-param name="requiredAttrivuteValue" select="$someValue"/> 
    </xsl:apply-templates> 
<xsl:template> 

Here someValue is generated dinamically and depends on few things, that are not significant here 

Спасибо заранее!

+2

Пожалуйста, пост XSLT вы уже пробовали , Благодарю. – potame

ответ

3

Я не думаю, что вам нужно режимы, просто начните с

<xsl:template match="@* | node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 

затем исключить элементы, которые вы не хотите скопировать с

<xsl:template match="childElement[not(@childElementAttribute = 'copyMe')]"/> 
+0

Привет, спасибо за ответ. Режимы нужны здесь, потому что xml, который я разместил, является частью всего документа. Поэтому я должен быть уверен, что шаблон не будет применяться к другим элементам. – Bogdan

+0

Также мне нужно retireve soveValue от переменной. Я обновил информацию в вопросе. Спасибо! – Bogdan

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