我有一個xml數據文件。我也有一個轉換該文件的xslt文件。這是我現在擁有的。原始的XML文件:使用XSLT,當子元素包含無真屬性時移除父元素
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="file:///C:/Users/chvl/Desktop/New%20folder%20(2)/UntitledDS.xslt"?>
<L4 type="schema" guid="de2f8f94-8db6-4979-b32f-8db4bfac3f3c" versionNumber="16" DpaLength="4">
<L4 type="group">
<FirmID type="item">
<value>872</value>
</FirmID>
<FirmName type="item">
<value>Generic Name Here</value>
</FirmName>
<FirmRef type="item">
<value>LC</value>
</FirmRef>
<ReportingEndDate type="item">
<value>2015-05-31</value>
</ReportingEndDate>
<L4 type="group">
<_x0030_257 type="item">
<value xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</_x0030_257>
<_x0030_258 type="item">
<value>1791886</value>
</_x0030_258>
<_x0030_725 type="item">
<value xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</_x0030_725>
<_x0030_726 type="item">
<value>407897</value>
</_x0030_726>
</L4>
</L4>
</L4>
這裏是通過XSLT
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="file:///C:/Users/chvl/Desktop/New%20folder%20(2)/UntitledDS.xslt"?>
<Root xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xs="http://www.w3.org/2001/XMLSchema" name="L4" type="schema" guid="de2f8f94-8db6-4979-b32f-8db4bfac3f3c" versionNumber="16" DpaLength="4">
<Main name="L4" type="group">
<FirmID type="item">
<value>872</value>
</FirmID>
<FirmName type="item">
<value>Generic Name Here</value>
</FirmName>
<FirmRef type="item">
<value>LC</value>
</FirmRef>
<ReportingEndDate type="item">
<value>2015-05-31</value>
</ReportingEndDate>
<Data name="L4" type="group">
<DataItem dpa="_x0030_257">
<value></value>
</DataItem>
<DataItem dpa="_x0030_258">
<value>1791886</value>
</DataItem>
<DataItem dpa="_x0030_725">
<value></value>
</DataItem>
<DataItem dpa="_x0030_726">
<value>407897</value>
</DataItem>
</Data>
</Main>
</Root>
要在原始XML後的新的XML文件,你看到孩子元素,其中,XSI:無=「真」?那麼,當發生這種情況時,我需要刪除它的父元素。在這個例子中,我需要刪除其所有子元素。
現在,我所嘗試的是將此代碼放在我的XSLT的末尾。
<xsl:template match="/*/*/*/node()[./*/(@xsi:nil = 'true')]|@*">/xsl:template>
它的工作原理,但它也從我的根元素刪除屬性和以及其他地方。但我需要所有這些屬性。我覺得我離解決這個問題只有一步之遙,但這一步變成了一個巨大的飛躍。
任何幫助,將不勝感激。
這是完整的XSLT和代碼片段代碼,用於刪除nil父元素(上面的示例沒有與代碼段一起運行以刪除nils)。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/*">
<Root>
<xsl:attribute name="name" >
<xsl:value-of select="name(.)"/>
</xsl:attribute>
<xsl:choose>
<xsl:when test="/*[type='schema']">
<xsl:apply-templates select="ignore"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="@*|node()"/>
</xsl:otherwise>
</xsl:choose>
</Root>
</xsl:template>
<xsl:template match="/*/*[@type='group']">
<Main>
<xsl:attribute name="name" >
<xsl:value-of select="name(.)"/>
</xsl:attribute>
<xsl:choose>
<xsl:when test="child::*[type='item']">
<xsl:apply-templates select="ignore"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="@*|node()"/>
</xsl:otherwise>
</xsl:choose>
</Main>
</xsl:template>
<xsl:template match="/*/*/*[@type='group']">
<Data>
<xsl:attribute name="name" >
<xsl:value-of select="name(.)"/>
</xsl:attribute>
<xsl:choose>
<xsl:when test="child::*[type='item']">
<xsl:apply-templates select="ignore"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="@*|node()"/>
</xsl:otherwise>
</xsl:choose>
</Data>
</xsl:template>
<xsl:template match="/*/*/*[@type='list']">
<Cube>
<xsl:attribute name="name" >
<xsl:value-of select="name(.)"/>
</xsl:attribute>
<xsl:choose>
<xsl:when test="child::*[type='item']">
<xsl:apply-templates select="ignore"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="@*|node()"/>
</xsl:otherwise>
</xsl:choose>
</Cube>
</xsl:template>
<xsl:template match="/*/*/Filters[@type='group']"/>
<xsl:template match="/*/*/*/*[@type='group']">
<xsl:variable name="count">
<xsl:number/>
</xsl:variable>
<Data grpcnt="{$count}">
<xsl:attribute name="name" >
<xsl:value-of select="name(.)"/>
</xsl:attribute>
<xsl:choose>
<xsl:when test="child::*[type='item']">
<xsl:apply-templates select="ignore"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="@*|node()"/>
</xsl:otherwise>
</xsl:choose>
</Data>
</xsl:template>
<xsl:template match="*/*/*/*[@type='item']">
<DataItem>
<xsl:attribute name="dpa" >
<xsl:value-of select="name(.)"/>
</xsl:attribute>
<value><xsl:value-of select="value"/></value>
</DataItem>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*/*/*/node()[./*/(@xsi:nil = 'true')]|@*">
</xsl:template>
</xsl:stylesheet>
PS:請記住,元素名稱的變化,這就是爲什麼我使用星星而不是硬編碼標籤名稱。
您的輸入XML有多個根,前綴xsi沒有在xslt – wero
中定義@wero'xsi:'與XSD相關,因爲在這種情況下不需要定義(我沒有仔細查看)。多根問題只是一個格式問題,我現在已經解決了。 –
@MathiasMüller* input * doc格式不正確,需要定義前綴「xsi」,因爲它在xpath位置步驟中使用。無論如何,你已經找到了答案... – wero