我正在尝试将XML从一种格式转换为另一种格式,但是没有足够的运气来寻找能够解释XML如何很好地工作的资源。如何使用其他XML标签内的值设置XML标签内的数据?
这是开始的XML
<?xml version="1.0" encoding="utf-8"?>
<In xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="in.xsd">
<Submit ID="1234">
<Label>
<Code>300</Code>
<Source>27</Source>
</Label>
<Data>
<Number>18</Number>
<Date>2018-04-01</Date>
<IsFile>0</IsFile>
<Location></Location>
<Files>
<File>
<Name>red.pdf</Name>
<Classification>FILE</Classification>
</File>
<File>
<Name>picture.pdf</Name>
<Type>IMAGE</Type>
</File>
</Files>
</Data>
</Submit>
</In>
我当前的XSLT
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="In"/>
</xsl:template>
<xsl:template match="In">
<Q xmlns:tns="Q" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Source="{@source}" Notification="true">
<xsl:value-of select="Submit/Label/Source"/>
</Q>
</xsl:template>
</xsl:stylesheet>
使用XSLT转换XML文件后的预期最终结果。
<?xml version="1.0" encoding="utf-8"?>
<Q xmlns:tns="Q" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="scheme.xsd" Source="27" Notification="true">
<SubmitID="1234">
<Label>
<Code>300</Code>
<Source>27</Source>
</Label>
<Data>
<Number>18</Number>
<Date>2018-04-01</Date>
<IsFile>0</IsFile>
</Data>
<Files>
<File>
<Name>red.pdf</Name>
<Type>FILE</Type>
</File>
<File>
<Name>picture.pdf</Name>
<Type>IMAGE</Type>
</File>
</Files>
</Submit>
</Q>
XSLT不完整,无法产生预期的结果。我仍然缺少生成介于两者之间的代码。
答案 0 :(得分:1)
请尝试以下XSLT-1.0样式表:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<!-- identity template - copies all elements and its children and attributes -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="/In"> <!-- Remove the 'In' element -->
<xsl:apply-templates select="node()"/>
</xsl:template>
<xsl:template match="Submit"> <!-- Create the 'Q' element and its sub-elements -->
<Q xmlns:tns="Q" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Source="{@source}" Notification="true">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="Label" />
<xsl:apply-templates select="Data" />
<xsl:apply-templates select="Data/Files" />
</xsl:copy>
</Q>
</xsl:template>
<xsl:template match="Data"> <!-- Create the 'Data' sub-element without all of its children -->
<xsl:copy>
<xsl:copy-of select="Number"/>
<xsl:copy-of select="Date"/>
<xsl:copy-of select="IsFile"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
这将返回我的大部分需求。这是正确的方法吗?
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="In"/>
</xsl:template>
<xsl:template match="In">
<Q xmlns:tns="Q" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Source="{Submit/Label/Source}" Notification="true">
<xsl:value-of select="Submit/Label/Source"/>
<Label>
<Code><xsl:value-of select="Submit/Label/Code"/></Code>
<Source><xsl:value-of select="Submit/Label/Source"/></Source>
</Label>
</Q>
</xsl:template>
</xsl:stylesheet>