如何在eclipse中启用/使用XSLT文档功能?

时间:2013-04-24 17:42:13

标签: eclipse function xslt layout document

我正在尝试编写一个XSLT文件,该文件将处理Android Activity布局xml文件并创建HTML等效文件。

在创建/测试xslt文件时,我使用的是 eclipse xslt 工具。

此路径上的障碍之一是,许多值未直接保存在Android布局文件中(例如字符串/文本值),而是保存在位于“values”文件夹中的单独xml文件中

我一直在尝试使用xslt函数'document'打开strings.xml文件,但没有成功。

  1. 问:我是否需要启用允许xslt文档功能运行的eclipse权限?

  2. 问:我对文档功能的运作方式有何不足之处?

  3. 尝试访问android strings.xml文件的 TextView 模板(在xslt文件中)中包含的行是:

    <xsl:value-of select="document('../values/strings.xml')/String[@name=substring-after(@android:text,'/')]" />

    • 布局文件位于res / layout文件夹
    • xslt位于res / xsl中 文件夹中。
    • strings.xml文件位于res / values文件夹

    以下是代码示例:

    Android XML布局代码

     <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        <!-- This is the full screen vertical layout -->
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"    
        android:orientation="vertical" >
        <!-- This is the main content vertical layout -->
    
    
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" 
            android:paddingLeft="@dimen/mainHeadingIndent" >
            <!--  This is the Status Section Vertical content layout -->
    
                <TextView
                    style="@style/HeadingTextStyle"
                    android:id="@+id/textView2"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight=".5"
                    android:text="@string/Status"/>
    **The rest of the layout file is intentionally omitted**
    

    这是XSLT文件

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:android="http://schemas.android.com/apk/res/android">
        <xsl:output method="html" version="4.0" encoding="iso-8859-1"
            indent="yes" />
    
        <xsl:template match="/">
            <html>
                <head>
                </head>
                <body>
                    <xsl:for-each select="LinearLayout">
                        <xsl:call-template name="LinearLayout">
                        </xsl:call-template>
                    </xsl:for-each>
                </body>
            </html>
        </xsl:template>
    
        <xsl:template name="LinearLayout">
            <xsl:variable name="width">
                <xsl:value-of select="@android:layout_width" />
            </xsl:variable>
            <xsl:variable name="height">
                <xsl:value-of select="@android:layout_height" />
            </xsl:variable>
            <xsl:variable name="margin">
                <xsl:value-of select="@android:layout_margin" />
            </xsl:variable>
            <xsl:variable name="orient">
                <xsl:value-of select="@android:orientation" />
            </xsl:variable>
            <xsl:variable name="pos">
                <xsl:number value="position()" format="1" />
            </xsl:variable>
    
            <div div_pos='{$pos}' Width='{$width}' Height='{$height}' Margin='{$margin}'
                Orient='{$orient}'>
                <xsl:for-each select="LinearLayout">
                    <xsl:call-template name="LinearLayout">
                    </xsl:call-template>
                </xsl:for-each>
                <xsl:for-each select="TextView">
                    <xsl:call-template name="TextView">
                    </xsl:call-template>
                </xsl:for-each>
                <xsl:for-each select="ImageButton">
                    <xsl:call-template name="ImageButton">
                    </xsl:call-template>
                </xsl:for-each>
                <xsl:for-each select="Spinner">
                    <xsl:call-template name="Spinner">
                    </xsl:call-template>
                </xsl:for-each>
                <xsl:for-each select="Button">
                    <xsl:call-template name="Button">
                    </xsl:call-template>
                </xsl:for-each>
            </div>
        </xsl:template>
    
        <xsl:template name="ImageButton">
            <div id="{@android:id}">
                <xsl:comment>
                    ImageButton
                </xsl:comment>
            </div>
        </xsl:template>
    
        <xsl:template name="TextView">
            <xsl:variable name="pos">
                <xsl:number value="position()" format="1" />
            </xsl:variable>
            Text field =
            <xsl:value-of select="@android:text" />
            <xsl:variable name="txt">
                <xsl:choose>
                    <xsl:when test="contains(@android:text,'/')">
                        <xsl:value-of select="document('../values/strings.xml')/String[@name=substring-after(@android:text,'/')]" />
                    <!-- 
                        <xsl:value-of select="substring-after(@android:text,'/')" />
                    -->
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select="@android:text" />
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:variable>
            <div id="{@android:id}">
                <xsl:comment>
                    TextView Element
                </xsl:comment>
                <p>
                    Text pointer is: <xsl:value-of select="$txt" />
                </p>
                <!-- <p>Text pointer is:<xsl:copy-of select="$txt"/></p> <xsl:value-of 
                    select="document('../values/strings.xml')/String[@name=$txt]" />
                        <xsl:value-of select="substring-after(@android:text,'/')" />
                    -->
            </div>
            endoftext
            <br />
        </xsl:template>
        <xsl:template name="Spinner">
            <div id="{@android:id}">
                <xsl:comment>
                    Spinner
                </xsl:comment>
            </div>
        </xsl:template>
        <xsl:template name="Button">
            <div id="{@android:id}">
                <xsl:comment>
                    Button
                </xsl:comment>
            </div>
        </xsl:template>
    </xsl:stylesheet>
    

2 个答案:

答案 0 :(得分:0)

您需要在XPath中包含文档的根元素(这很容易忘记):

<xsl:value-of select="document('../values/strings.xml')/*/String[@name=substring-   after(@android:text,'/')]" />

答案 1 :(得分:0)

好吧,我已经解决了。 最大的问题是,当xslt失败时,它通常会无声地失败....即没有错误

问题证明不是文件功能本身。这是文档功能之后的选择标准。这有一个问题,即没有选定的节点,因此没有声明的输出。这一切都使文档功能看起来不起作用。

最大的变化是substring-after子句没有/没有针对right属性进行评估。通过拆分子串子句,它开始工作。 正如他们所说,它是“FM”(翻转魔法)!

以下是我用以下内容替换文档行的内容:

<xsl:variable name='string_value'>
  <xsl:value-of select="substring-after(@android:text,'/')" />
</xsl:variable>
<xsl:value-of select="$string_value"/>
<xsl:value-of select="document('../values/strings.xml')/*/string[@name=$string_value]"/>

这成功地从strings.xml文件中提取了正确的值。