2014-04-15 50 views
0

我有以下XML文件作为输入,并且对于<CI_DateTypeCode>元素的每个实例,我需要更改@codeListValue属性值。XSLT避免在元素属性之间添加新行

该转换工作,但我得到输出不必要/不需要的新行@codeList属性和@codeListValue属性之间。

如您所见,源XML文件中有属性之间没有新行。 我该如何避免这种行为?

XML源文件

<?xml version="1.0"?> 
    <?xml-stylesheet type="text/xsl" href="c:\ISO19139_rve.xsl"?> 
    <MD_Metadata xmlns="http://www.isotc211.org/schemas/2005/gmd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gco="http://www.isotc211.org/schemas/2005/gco" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="http://www.isotc211.org/schemas/2005/gmd/gmd.xsd"> 
     <MD_DataIdentification> 
      <citation> 
       <CI_Citation> 
        <title> 
         <gco:CharacterString>Title</gco:CharacterString> 
        </title> 
        <date> 
         <CI_Date> 
          <date> 
           <gco:CharacterString>2014-04-15</gco:CharacterString> 
          </date> 
          <dateType> 
           <CI_DateTypeCode codeList="./resource/codeList.xml#CI_DateTypeCode" codeListValue="Creazione">Creazione</CI_DateTypeCode> 
          </dateType> 
         </CI_Date> 
        </date> 
       </CI_Citation> 
      </citation> 
     </MD_DataIdentification> 
    </MD_Metadata> 

XSL转换

<xsl:stylesheet 
    version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:gml="http://www.opengis.net/gml/3.2" 
    xmlns:gco="http://www.isotc211.org/schemas/2005/gco" 
    xmlns:gmd="http://www.isotc211.org/schemas/2005/gmd" 
    xmlns="http://www.isotc211.org/schemas/2005/gmd" 
    > 

    <xsl:strip-space elements="*"/> 

    <xsl:output indent="yes" encoding="UTF-8"/> 

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

    <!-- <CI_DateTypeCode>: @codeListValue attribute values --> 
    <xsl:param name="pCIDateTypeCodeCreation" select="'creation'"/> 
    <xsl:param name="pCIDateTypeCodePublication" select="'publication'"/> 
    <xsl:param name="pCIDateTypeCodeRevision" select="'revision'"/> 
    <xsl:param name="pCIDateTypeCodeOther" select="''"/> 

    <!-- override: <CI_DateTypeCode> to apply @codeListValue attribute values --> 
    <xsl:template match="gmd:CI_DateTypeCode/@codeListValue"> 
     <xsl:choose> 
      <xsl:when test="lower-case(.) eq 'creazione'"> 
       <xsl:attribute name="codeListValue"> 
        <xsl:value-of select="$pCIDateTypeCodeCreation"/> 
       </xsl:attribute> 
      </xsl:when> 
      <xsl:when test="lower-case(.) eq 'pubblicazione'"> 
       <xsl:attribute name="codeListValue"> 
        <xsl:value-of select="$pCIDateTypeCodePublication"/> 
       </xsl:attribute> 
      </xsl:when> 
      <xsl:when test="lower-case(.) eq 'revisione'"> 
       <xsl:attribute name="codeListValue"> 
        <xsl:value-of select="$pCIDateTypeCodeRevision"/> 
       </xsl:attribute> 
      </xsl:when> 
      <xsl:when test="lower-case(.) eq 'rilievo'"> 
       <xsl:attribute name="codeListValue"> 
        <xsl:value-of select="$pCIDateTypeCodeOther"/> 
       </xsl:attribute> 
      </xsl:when> 
     </xsl:choose> 
    </xsl:template>  
</xsl:stylesheet> 

实际XML输出(见与缩进@codeList@codeListValue属性之间新行):

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="c:\ISO19139_rve.xsl"?> 
<MD_Metadata xmlns="http://www.isotc211.org/schemas/2005/gmd" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:gco="http://www.isotc211.org/schemas/2005/gco" 
      xmlns:gml="http://www.opengis.net/gml" 
      xmlns:xlink="http://www.w3.org/1999/xlink" 
      xsi:schemaLocation="http://www.isotc211.org/schemas/2005/gmd/gmd.xsd"> 
    <MD_DataIdentification> 
     <citation> 
     <CI_Citation> 
      <title> 
       <gco:CharacterString>Title</gco:CharacterString> 
      </title> 
      <date> 
       <CI_Date> 
        <date> 
        <gco:CharacterString>2014-04-15</gco:CharacterString> 
        </date> 
        <dateType> 
        <CI_DateTypeCode codeList="./resource/codeList.xml#CI_DateTypeCode" 
             codeListValue="creation">Creazione</CI_DateTypeCode> 
        </dateType> 
       </CI_Date> 
      </date> 
     </CI_Citation> 
     </citation> 
    </MD_DataIdentification> 
</MD_Metadata> 
+0

为什么重要?单个标签中属性之间是否存在空格不会影响XML解析器。此外,我不认为有任何方法可以在XSLT中控制它 - XSLT生成输出树结构,但如何将其呈现为XML取决于序列化程序。 –

+1

更改'的xsl:output'所以不会缩进:'的' – helderdarocha

回答

1

显示的输出看起来好像来自撒克逊。我个人认为它读得很好。当然,你根本不需要缩进(在xsl:output上设置indent="no")。

如果您的确在使用Saxon,您可以通过使用<xsl:output saxon:line-length="1000"/>增加最大行长来减少属性换行到新行的可能性,但请注意,只要此行带有行的文件可能会导致一些文本编辑。

http://www.saxonica.com/documentation/index.html#!extensions/output-extras/line-length

+1

@all如果设置'缩进= “否”'我失去所有缩进,这不是我想要的......我将Saxon与oXygen XML Editor一起使用,但这只是为了创建转换过程中的方便。然后,我需要使用Windows Form Application和.NET'XslCompiledTransform'类将最终转换应用于许多文件,并传递xsl文件。 –