2015-01-07 7 views
-1

У меня есть следующий XML;XSLT для удаления элементов XML

<?xml version="1.0"?> 
<dataroot generated="2015-01-07T10:49:16" xmlns:od="urn:schemas-microsoft-com:officedata"> 
<order job_id="S026500-1" site_code="DG" replace=""> 
<ORDERPK>3</ORDERPK> 
<Replace>true</Replace> 
<job_description>TESTING</job_description> 
<order_qty>20000</order_qty> 
<finishing_style>PB</finishing_style> 
<depth>10</depth> 
<width>8</width> 
<cover_pagination>4</cover_pagination> 
<text_pagination>24</text_pagination> 
<delivery_commence_date>19/12/2014</delivery_commence_date> 
<delivery_complete_date>19/12/2014</delivery_complete_date> 
<job_site>DG</job_site> 
<managing_printer>DG</managing_printer> 
<is_managing_printer>True</is_managing_printer> 
</order> 
<master_version> 
<ORDER>1</ORDER> 
<version_id></version_id> 
<version_code>COMM</version_code> 
<version_common>true</version_common> 
<version_finished>false</version_finished> 
<version_description>Common</version_description> 
<version_nett_qty>176262</version_nett_qty> 
<version_special_qty>10</version_special_qty> 
</master_version> 
<master_version> 
<ORDER>2</ORDER> 
<version_code>COMM</version_code> 
<version_common>TRUE</version_common> 
<version_finished>FALSE</version_finished> 
<version_description>Common</version_description> 
<version_nett_qty>1900</version_nett_qty> 
<version_special_qty>0</version_special_qty> 
</master_version> 
<master_version> 
<ORDER>3</ORDER> 
<version_code>COMM</version_code> 
<version_common>true</version_common> 
<version_finished>false</version_finished> 
<version_description>common</version_description> 
<version_nett_qty>20000</version_nett_qty> 
<version_special_qty>0</version_special_qty> 
</master_version> 

Я хотел бы, чтобы удалить все «master_version» таблицы, где порядок не равен ORDERPK в таблице «порядка». Есть ли кто-нибудь, кто мог бы помочь мне с помощью XSLT? У меня нет кода для публикации, и я совершенно не понимаю, как это сделать.

Спасибо!

ответ

2

Если вы начинаете с шаблоном

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

вы можете добавить шаблоны для удаления узлов, например,

<xsl:template match="master_version[not(ORDER = //order/ORDERPK)]"/> 

удалит master_version элементы, где значение ORDER элемент не найден в order/ORDERPK элемента.

+0

пробита! Я предпочитаю, чтобы этот был моим. Исключение метода несогласованных элементов обеспечивает гораздо меньший подробный код, чем вывод подходящих. – Whelkaholism

+0

Честно говоря, я должен согласиться, мне кажется, что это проще для меня, я просто изучаю только XML, но я ценю оба ответа, так что спасибо вам обоим! –

2

Используйте шаблон тождественного вернуть все нетронутое, и предоставить шаблон переопределения для <master_version> элемента только вернуть порядок согласования:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:output method="xml" indent="yes" /> 
     <!-- - - - - - - - - - - - - - - - - - - - - - - - 
     IDENTITY 
     - - - - - - - - - - - - - - - - - - - - - - - - --> 
     <xsl:template match="@*|node()"> 
       <xsl:copy> 
         <xsl:apply-templates select="@*|node()" /> 
       </xsl:copy> 
     </xsl:template> 
     <!-- - - - - - - - - - - - - - - - - - - - - - - - 
     OVERRIDES 
     - - - - - - - - - - - - - - - - - - - - - - - - --> 
     <xsl:template match="master_version"> 
       <xsl:if test="ORDER = /dataroot/order/ORDERPK"> 
         <xsl:copy> 
           <xsl:apply-templates /> 
         </xsl:copy> 
       </xsl:if> 
     </xsl:template> 
</xsl:stylesheet> 
Смежные вопросы