保留文档标记的属性

时间:2014-07-09 08:20:49

标签: xml xslt

下面我将此XML用作输入

<?xml version="1.0" encoding="utf-8"?>
<Document xmlns="some:urn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <People>
    <Personal>
      <Name>Juan Dela Cruz</Name>
      <Age>21</Age>
    </Personal>
    <Employment>
      <Start>21-02-2014</Start>
      <EmpNumber>1234</EmpNumber>
      <IDNumber></IDNumber>
    </Employment>
    <Personal>
      <Name>Anna Dela Cruz</Name>
      <Age>23</Age>
    </Personal>
    <Employment>
      <Start>21-02-2014</Start>
      <EmpNumber>1235</EmpNumber>
      <IDNumber>1235</IDNumber>
    </Employment>
  </People>
</Document>

当我尝试使用此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:copy-of select="Document"/>
    <Document xmlns="some:urn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <xsl:apply-templates select="Document/People" />
    </Document>
  </xsl:template>

  <xsl:template match ="People">
    <People>
      <xsl:apply-templates select="Personal" />
      <xsl:apply-templates select="Employment" />
    </People>
  </xsl:template>

  <xsl:template match="Personal">
    <Name>
      <xsl:value-of select ="Personal/Name/." />
    </Name>
    <Age>
      <xsl:value-of select ="Personal/Age/." />
    </Age>
  </xsl:template>

  <xsl:template match="Employment">
    <Start>
      <xsl:value-of select ="Employment/Start/." />
    </Start>
    <EmpNumber>
      <xsl:value-of select ="Employment/EmpNumber/." />
    </EmpNumber>
    <IDNumber>
      <xsl:value-of select ="Employment/IDNumber/." />
    </IDNumber>
  </xsl:template>

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

我只得到这个结果:

<?xml version="1.0" encoding="utf-8"?>
<Document xmlns="some:urn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />

我需要这样的结果

<?xml version="1.0" encoding="utf-8"?>
<Document xmlns="some:urn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <People>
    <Personal>
      <Name>Juan Dela Cruz</Name>
      <Age>21</Age>
    </Personal>
    <Employment>
      <Start>21-02-2014</Start>
      <EmpNumber>1234</EmpNumber>
    </Employment>
    <Personal>
      <Name>Anna Dela Cruz</Name>
      <Age>23</Age>
    </Personal>
    <Employment>
      <Start>21-02-2014</Start>
      <EmpNumber>1235</EmpNumber>
      <IDNumber>1235</IDNumber>
    </Employment>
  </People>
</Document>

任何人都知道我的XSLT有什么问题,我使用Visual Studio来转换XML

TIA:)

1 个答案:

答案 0 :(得分:1)

您需要考虑输入XML中的命名空间,所有匹配模式和选择的表达式(如DocumentPeople分别匹配在您的输入元素所在的时没有命名空间中的那些名称的元素命名空间。因此,在样式表中为输入中使用的命名空间声明一个名称空间前缀,并在匹配模式和XPath表达式中使用该前缀来限定元素名称:

<xsl:stylesheet
  xmlns:df="some:urn"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

然后使用例如match="df:People"select="df:Personal"等等。但是你还没有告诉我们你想要的转换结果,目前还不清楚转换需要在输入上做出哪些改变。

根据您编辑的问题和您想要的样本,您需要的是

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

    <xsl:template match="*[not(*) and not(normalize-space())]"/>

</xsl:stylesheet>

将简单地复制所有节点,但禁止复制<IDNumber></IDNumber>等空元素节点。