有一个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>

我需要拿出XML文件形式的所有XSLT和脚本:

<dict>
    <trans key="Выбор" value="Выбор партии" />
    <trans key="Всего на складе участка" value="Всего на складе участка" />
    <trans key="Ед.изм." value="Единицы измерения" />
    <trans key="№ технолог. серии" value="№ технолог. серии" />
    <trans key="Подпись исполнителя /мастера" value="Подпись исполнителя/ Подпись мастера" />
    <trans key="Последн смена (последн расход)" value="Последнее списание в серии" />
</dict>
1 回复  |  直到 9 年前
    1
  •  1
  •   Martin Honnen    9 年前

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

    <?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>