XSLT转换

时间:2016-02-18 15:24:36

标签: xml xslt-2.0

有一个XML文件。粗略地说它看起来像这样:

<DOCUMENT>
  .......
  <CONTENT>
    ......
    <PHASE>
      ......
      <INSTRUCTION>
        ......
        <VALUE><![CDATA[<script LANGUAGE="JavaScript" type="text/javascript">
        arrayTitle = arrayTitle.concat([
        ["Выбор", "Выбор партии"],
        ["Всего на складе участка", "Всего на&nbspскладе участка"],
        ["№ технолог. серии", "№&nbspтехнолог. серии"],
        ["Подпись исполнителя /мастера", "Подпись&nbspисполнителя/ Подпись&nbspмастера"],
        ["Последн смена (последн расход)", "Последнее списание в&nbspсерии"]
        ]);</script>]]>
        </VALUE>
        ......

      </INSTRUCTION>
      ......
    </PHASE>
    ...... 
  </CONTENT>
......
<DOCUMENT>

我需要提取所有XSLT,脚本以XML文件的形式出现:

<dict>
    <trans key="Выбор" value="Выбор партии" />
    <trans key="Всего на складе участка" value="Всего на складе участка" />
    <trans key="Ед.изм." value="Единицы измерения" />
    <trans key="№ технолог. серии" value="№ технолог. серии" />
    <trans key="Подпись исполнителя /мастера" value="Подпись исполнителя/ Подпись мастера" />
    <trans key="Последн смена (последн расход)" value="Последнее списание в серии" />
</dict>

1 个答案:

答案 0 :(得分:1)

以下是使用Saxon 9.7 EE测试的XSLT 3.0样式表,它使用了analyze-string函数,parse-json function,然后使用了XPath 3.1中的新array type

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:fn="http://www.w3.org/2005/xpath-functions"
  xmlns:array="http://www.w3.org/2005/xpath-functions/array"
  exclude-result-prefixes="xs fn array">

<xsl:output indent="yes"/>

<xsl:template match="/">
  <xsl:apply-templates select="DOCUMENT/CONTENT/PHASE/INSTRUCTION/VALUE"/>
</xsl:template>

<xsl:template match="VALUE">
  <dict>
    <xsl:apply-templates select="analyze-string(.,  '\[.*\]', 's')//fn:match/parse-json(.)?*"/>
  </dict>
</xsl:template>

<xsl:template match=".[. instance of array(xs:string)]">
  <trans key="{.?1}" value="{.?2}"/>
</xsl:template>

</xsl:stylesheet>

它转换输入

<DOCUMENT>
  .......
  <CONTENT>
    ......
    <PHASE>
      ......
      <INSTRUCTION>
        ......
        <VALUE><![CDATA[<script LANGUAGE="JavaScript" type="text/javascript">
        arrayTitle = arrayTitle.concat([
        ["Выбор", "Выбор партии"],
        ["Всего на складе участка", "Всего на&nbspскладе участка"],
        ["№ технолог. серии", "№&nbspтехнолог. серии"],
        ["Подпись исполнителя /мастера", "Подпись&nbspисполнителя/ Подпись&nbspмастера"],
        ["Последн смена (последн расход)", "Последнее списание в&nbspсерии"]
        ]);</script>]]>
        </VALUE>
        ......

      </INSTRUCTION>
      ......
    </PHASE>
    ...... 
  </CONTENT>
......
</DOCUMENT>

进入结果

<?xml version="1.0" encoding="UTF-8"?>
<dict>
   <trans key="Выбор" value="Выбор партии"/>
   <trans key="Всего на складе участка" value="Всего на&amp;nbspскладе участка"/>
   <trans key="№ технолог. серии" value="№&amp;nbspтехнолог. серии"/>
   <trans key="Подпись исполнителя /мастера"
          value="Подпись&amp;nbspисполнителя/ Подпись&amp;nbspмастера"/>
   <trans key="Последн смена (последн расход)"
          value="Последнее списание в&amp;nbspсерии"/>
</dict>

要使用与开源Saxon 9.7 HE相同的方法,我们可以使用

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:fn="http://www.w3.org/2005/xpath-functions"
  xmlns:array="http://www.w3.org/2005/xpath-functions/array"
  exclude-result-prefixes="xs fn array">

<xsl:output indent="yes"/>

<xsl:template match="/">
  <xsl:apply-templates select="DOCUMENT/CONTENT/PHASE/INSTRUCTION/VALUE"/>
</xsl:template>

<xsl:template match="VALUE">
  <dict>
    <xsl:for-each select="analyze-string(.,  '\[.*\]', 's')//fn:match/parse-json(.)?*">
      <tans key="{.?1}" value="{.?2}"/>
    </xsl:for-each>
  </dict>
</xsl:template>

</xsl:stylesheet>