我希望转换XML文件,以便删除子标题“ Subheader1”和“ Subheader2”,以便我拥有的程序可以读取XML数据并在“行/行”下识别信息。
在这种情况下,实现此目标的最佳方法是删除子标题并将所有元素保留在单个标题下。
我已经尝试解决我遇到的问题。但是,我所做的XSLT只是被忽略了。到目前为止,我已经实现了仅导出元素数据。但是元素标头被忽略。或者,在这种情况下,XSLT仅导出完全相同的格式。我只是不明白为什么会这样。
XML输入
<Header xmlns="urn:stuff:xml:ns:neo">
<ID>1</ID>
<Department>350</Department>
<Date>2019-03-07T14:38:00</Date>
<Order_Number>12345</Order_Number>
<Comment/>
<Status>Picking</Status>
<Subheader1>
<Subheader2>
<Product>12510101</Product>
<Quantity>1</Quantity>
<Comment_Line/>
<Location>R11</Location>
</Subheader2>
</Subheader1>
</Header>
XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="urn:stuff:xml:ns:neo">
<xsl:output method="xml"
omit-xml-declaration="yes"
indent="yes"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<xsl:template match="Subheader1" />
<xsl:template match="Subheader2" />
</xsl:stylesheet>
XML输出
<Header xmlns="urn:stuff:xml:ns:neo">
<ID>1</ID>
<Department>350</Department>
<Date>2019-03-07T14:38:00</Date>
<Order_Number>12345</Order_Number>
<Comment/>
<Status>Picking</Status>
<Product>12510101</Product>
<Quantity>1</Quantity>
<Comment_Line/>
<Location>R11</Location>
</Header>
我的当前输出
1
350
360
361
2019-03-07T14:38:00
615619
Active
1
12510101
50153061
23663
Active
RM STD
我期望上面添加的XML输出。任何与此有关的帮助,包括需要做的事情和原因,将不胜感激。试图修复此问题已经有一段时间了,只是在我无法理解为什么会发生这一点上。
答案 0 :(得分:2)
XSLT可能被“忽略”的一般原因:
输入XML位于一个或多个命名空间中,无论是显式还是默认情况下, 并且您的XSLT与没有名称空间的元素匹配。看到 下面的XSLT了解如何与命名空间元素进行匹配。
元素中的元素名称之间存在拼写错误或大小写不一致 输入XML和XSLT。
提供的XSLT模板均不匹配,仅剩下built-in template rules即可执行转换。
附带说明:您当前的输出实际上并不是为发布的XML输入文件生成的发布的XSLT。它将按照身份转换将输入XSLT复制到输出XSLT,并且您的两个BALANCED
和Line
模板将无效,因为没有Lines
或Line
元素在您输入的XML中。
您的特定情况:您可以通过以下XSLT打开Lines
和Subheader1
元素的内容:
Subheader2
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:neo="urn:stuff:xml:ns:neo">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="neo:Subheader1 | neo:Subheader2">
<xsl:apply-templates select="node() | @*"/>
</xsl:template>
</xsl:stylesheet>
您可以通过以下方法消除多余的空格
<Header xmlns="urn:stuff:xml:ns:neo">
<ID>1</ID>
<Department>350</Department>
<Date>2019-03-07T14:38:00</Date>
<Order_Number>12345</Order_Number>
<Comment/>
<Status>Picking</Status>
<Product>12510101</Product>
<Quantity>1</Quantity>
<Comment_Line/>
<Location>R11</Location>
</Header>
已添加到 <xsl:strip-space elements="neo:Subheader1 neo:Subheader2"/>
,或者您可能只想复制这两个元素的 (xsl:stylesheet
)个孩子,而不是所有*
个孩子:
node()
请注意,这里 <xsl:template match="neo:Subheader1 | neo:Subheader2">
<xsl:apply-templates select="* | @*"/>
</xsl:template>
并不是真正需要的,但是如果您的实际案例具有属性,则可能会有所帮助。同样,请注意,在将| @*
更改为processing-instruction()|comment()
之后,如果需要此类子类型,可以添加回node()
。