XForms sử dụng Ngôn ngữ Đường dẫn XML (XPath) làm hàm và ngôn ngữ đánh giá cơ bản của nó. Đây là XPath giống như thường dùng trong XSLT (Extensible Stylesheet Language Transformations - Các chuyển đổi Ngôn ngữ bảng định kiểu mở rộng). Ngoài các hàm quen thuộc như đếm và chuỗi con, XForms còn giới thiệu một số hàm mở rộng có ích cho XPath dành cho các phép toán số, ngày, và XForms-cụ thể bao gồm cả if (nếu), avg (trung bình), min (nhỏ nhất), max (lớn nhất), now (bây giờ), days-from-date (số ngày từ ngày), month (tháng), và instance (cá thể).

Elliotte Rusty Harold, Giáo sư, Polytechnic University

Elliotte Rusty Harold xuất thân từ bang New Orleans nơi mà ông vẫn thỉnh thoảng về thăm những lúc thảnh thơi. Tuy nhiên, ông đang cư trú gần Trung tâm University Town Center, Irvine cùng với vợ ông là Beth và những chú mèo Charm (được đặt tên theo hạt "charm quark" trong vật lý) và Marjorie (đặt tên theo tên của mẹ vợ ông). Trang Web Cafe au Lait của ông đã trở thành một trong những trang Java độc lập nổi tiếng nhất trên Internet, và trang Web phụ của ông, Cafe con Leche, đã trở thành một trong những trang XML phổ biến nhất. Cuốn sách của ông gần đây nhất là Refactoring HTML



30 11 2011

XForms chấp nhận ngôn ngữ biểu thức XPath quen thuộc với hai mục đích. Đầu tiên, XForms sử dụng XPath như một ngôn ngữ truy vấn để giải quyết và xác định các trường trong dạng mẫu và các dữ liệu do người dùng trình lên. Cụ thể, nó sử dụng các biểu thức XPath để liên kết các nút điều khiển đầu vào với các bộ phận riêng biệt của mô hình dữ liệu của dạng mẫu. Thứ hai, nó sử dụng XPath làm ngôn ngữ tính toán cơ bản của mình cho các phần tử output, bindsetvalue. Trọng tâm của bài viết này chủ yếu dựa vào cách sử dụng thứ hai, mặc dù một số trong các hàm này cũng có ích để liên kết.

XPath đã được cả những người dùng lẫn những người thực hiện thiết kế để mở rộng. XPath 1.0 định nghĩa một tập các hàm cơ bản chẳng hạn như counttranslate phù hợp cho một loạt các mục đích. Các ngôn ngữ ví dụ như XSLT, XQuery, XPointer (XML Pointer Language – Ngôn ngữ Con trỏ XML), XML Signature (Chữ ký XML) và XForms, chấp nhận ngôn ngữ biểu thức XPath, được dự kiến mở rộng dựa vào tập cơ bản này với các hàm bổ sung. XForms lợi dụng điều này bằng cách đưa vào các hàm mới có ích trong việc xử lý dạng mẫu. Cụ thể là, XForms thêm các hàm dùng cho các phép toán toán học, ngày tháng, thời gian, các số Boolean, và XForms-cụ thể. Bạn có thể không bao giờ nhìn thấy các hàm này trong một bảng định kiểu XSLT hay một chương trình Jaxen, nhưng bạn có thể sử dụng chúng trong bất kỳ tài liệu XForms 1.0 nào.

XForms để tính toán

Tôi sẽ bắt đầu với một ví dụ đơn giản. Liệt kê 1 cho thấy một Xform cơ bản hiển thị ngày hôm nay.

Liệt kê 1. Một tài liệu XHTML có chứa một Xform đơn giản
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:xforms="http://www.w3.org/2002/xforms">
   <head>
    <title>Date and Time</title>
    <xforms:model>
     <xforms:instance xmlns="">
      <Name/>
     </xforms:instance>
    </xforms:model>
   </head>
   <body>
    <h1>
      <xforms:output value="now()">
        <xforms:label>The time is now: </xforms:label>
      </xforms:output>
    </h1>
   </body>
</html>

Hình 1 cho thấy dạng mẫu này đang chạy trong Firefox với trình cắm thêm XForms của Mozilla.

Hình 1. Ngày do hàm now đưa ra
Bây giờ là: 2007-06-10T08:54:21-05:00

Phần tử xforms:output đánh giá biểu thức XPath 1.0 có chứa trong thuộc tính value của nó. Nó chèn kết quả này vào khung nhìn của trình duyệt của tài liệu. Trong ví dụ này, biểu thức XPath chỉ gồm có hàm now(), trả về ngày và thời gian hiện tại, có định dạng theo ISO 8601. Đó là, năm-tháng-ngày: giờ: phút: giây-múi giờ. Đây là định dạng thời gian do đặc tả Lược đồ XML giới thiệu. Liệt kê 1 đơn giản và rõ ràng trừ một điều: người ta đã hỏi hàm the now() này đến từ đâu?

XSLT 1.0 và XPath 1.0 không có hàm now(). Thực vậy, việc có hàm này sẽ mâu thuẫn với tính chất cơ bản của XSLT là một ngôn ngữ lập trình chức năng. Một bảng định kiểu, sử dụng một hàm now(), tạo ra các kết quả khác nhau tùy thuộc vào lúc chạy nó. Tuy nhiên, XForms không có các mục tiêu và các ràng buộc giống như XSLT. XForms cũng không có cả chức năng lẫn ngôn ngữ Turing đầy đủ. Dĩ nhiên là, nó là ngôn ngữ khai báo. Vì vậy, các hàm như hàm now() không phù hợp trong XSLT, lại phù hợp tốt với XForms. Với ý nghĩ đó, tôi sẽ khám phá các hàm mới khác mà XForms 1.0 đưa vào.


Số ngày và thời gian

2007-06-10T08:54:21-05:00 là đầy đủ, nhưng nó chưa hoàn toàn chính xác. XForms thêm bốn hàm nữa để chuyển đổi số ngày thành các mẩu riêng như số năm và số tháng:

  • days-from-date()
  • seconds-from-dateTime()
  • seconds()
  • months()

Hai hàm đầu tiên hoạt động theo ngày-số giờ và có thể được người dùng sử dụng trên kết quả đầu ra của hàm now() cũng như trên đầu vào của các giá trị ngày hoặc được cung cấp theo dạng mẫu riêng của nó. Hai hàm thứ hai hoạt động theo các khoảng thời gian, cũng theo định dạng do ISO 8601 và Ngôn ngữ lược đồ của W3C (World Wide Web Consortium - Hiệp hội mạng toàn cầu) quy định.

Hàm days-from-date()

Hàm days-from-date (số ngày-từ-ngày) chuyển đổi một ngày theo dạng mẫu 2007-07-30T08 :54:21-05:00 hay 2007-07-30 thành số ngày đã trôi qua kể từ 01.01.1970. Bạn có thể sử dụng hàm này để tính toán sự khác biệt giữa hai ngày hoặc số lượng thời gian đã trôi qua. Ví dụ, Liệt kê 2 đếm số ngày còn lại cho đến Lễ Giáng sinh:

Liệt kê 2. Một Xform đếm số ngày còn lại cho đến Lễ Giáng sinh
<html xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:xforms="http://www.w3.org/2002/xforms">
   <head>
    <title>Days until Christmas</title>
    <xforms:model>
     <xforms:instance xmlns="">
      <variables>
        <Now/>
        <Year/>
        <Christmas/>
        <ChristmasDay/>
        <Result/>
      </variables>
     </xforms:instance>

    <xforms:bind nodeset="Now" calculate="days-from-date(now())"/>
    <xforms:bind nodeset="Year" calculate="substring(now(), 1, 4)"/>
    <xforms:bind nodeset="Christmas" calculate="concat(../Year, '-12-25')"/>
    <xforms:bind nodeset="ChristmasDay" calculate="days-from-date(../Christmas)"/>
    <xforms:bind nodeset="Result" calculate="../ChristmasDay - ../Now"/>

    </xforms:model>
   </head>
   <body>
    <h1>
      <xforms:output value="Result">
        <xforms:label>Days until Christmas: </xforms:label>
      </xforms:output>
    </h1>
   </body>
</html>

Nén dạng mẫu

Nén dạng mẫu có thể được viết bằng một biểu thức XPath phức tạp dài dòng như sau:

days-from-date(concat(substring(now(), 1, 4), '-12-25')) - days-from-date(now())

Tuy nhiên, dạng mẫu này có vẻ rõ ràng hơn với các biến tạm thời.

Trong trường hợp này, cá thể này giữ năm biến tạm thời: Christmas, ChristmasDay, Now, YearResult. Năm biến này được các biểu thức XPath trong các phần tử bind thiết lập.

  • Biến Now được thiết lập bằng cách sử dụng hàm days-from-date để nhận được số ngày đã trôi qua kể từ 01.01.1970 cho đến ngày hôm nay.
  • Biến Year được thiết lập bằng cách loại bỏ bốn chữ số đầu tiên của ngày hôm nay bằng một phép toán chuỗi con.
  • Biến Christmas được thiết lập bằng cách gắn thêm "-12-25" vào biến Year được lấy ra trong bước trên.
  • Biến ChristmasDay được thiết lập bằng cách sử dụng hàm days-from-date trên biến Christmas.
  • Dạng mẫu này trừ biến Now từ ChristmasDay để nhận được số ngày còn lại.

Kết quả cuối cùng được một phần tử output hiển thị.

Dạng mẫu này vẫn chưa xử lý số ngày sau ngày 25 tháng 12. Tôi sẽ giới thiệu một hàm mở rộng hơn để trợ giúp cho việc đó ngay bây giờ.

Hàm seconds-from-dateTime()

Hàm seconds-from-dateTime chuyển đổi một ngày theo dạng mẫu 2007-07-30T08 :54:21-05: 00 thành số giây đã trôi qua kể từ nửa đêm, 01.01.1970, Giờ chuẩn căn cứ theo kinh tuyến Greenwich. Bạn có thể sử dụng hàm này để tính toán sự khác biệt giữa hai thời gian hoặc số thời gian đã trôi qua. Ví dụ, phần tử output này đếm số giây còn lại cho đến Lễ Giáng sinh:

<xforms:output value="seconds-from-dateTime(
  concat(substring(now(), 1, 4), '-12-25T00:00:00-05:00')) 
  - seconds-from-dateTime(now())">
   <xforms:label>Seconds until Christmas: </xforms:label>
</xforms:output>

seconds-from-dateTime trả về NaN nếu nó không thể chuyển đổi chuỗi thành một ngày.

Hàm seconds()

Hàm seconds() hoạt động dựa vào các khoảng thời gian chứ không phải là datetimes (các ngày giờ). Nó lấy một chuỗi dưới dạng P3DT10H30M1.5S (3 ngày, 10 giờ, 0 phút, và 1,5 giây) và chuyển đổi nó thành số giây (mặc dù có thể phân đoạn). Điều này rất có ích để so sánh các khoảng thời gian và cộng và trừ chúng.

Hàm months()

Hàm months() cũng hoạt động dựa vào khoảng thời gian. Nó lấy một chuỗi dưới dạng P2Y7M3DT10H30M1.5S (2 năm, 7 tháng, 3 ngày, 10 giờ, 0 phút, và 1,5 giây) và chuyển đổi nó thành số tháng. Các ngày, các giờ, các phút và các giây được cắt ngắn.

Không có các hàm days(), hours() hay minutes() tương ứng. Nếu bạn muốn các hàm đó, bạn phải yêu cầu số giây, sau đó làm toán.


Các hàm số

XForms thêm bốn hàm số vào XPath 1.0:

  • avg()
  • min()
  • max()
  • count-non-empty()

Hàm avg()

Hàm avg() tính trung bình số học của một tập-nút. Có nghĩa là, nó chuyển đổi từng nút của các nút trong tập này thành số, cộng tổng chúng, và chia kết quả cho số các nút. Nếu không thể chuyển đổi được bất kỳ nút nào của các nút trong tập-nút đối số của nó thành số, thì hàm avg() trả về NaN.

Hàm min() và max()

Các hàm min()max() cũng lấy các tập-nút làm các đối số. Mỗi thành viên được chuyển đổi thành một số. Hàm min() trả về giá trị nhỏ nhất và hàm max() trả về giá trị lớn nhất. Nếu không thể chuyển đổi bất kỳ đối số nào trong số các đối số thành một số, thì các hàm này trả về NaN.

Ví dụ, mô hình XForms trong Liệt kê 3 cung cấp một số phép đo nhiệt độ. (Người dùng sẽ sử dụng một nút điều khiển lặp lại để điền chúng vào). Sau đó, các phần tử bind tính nhiệt độ nhỏ nhất, lớn nhất, và trung bình của tất cả các phép đo nhiệt độ và gán chúng cho các phần tử khác.

Liệt kê 3. Một mô hình XForms tính các nhiệt độ cao, thấp, trung bình từ nhiều phép đo
    <xforms:model>
     <xforms:instance xmlns="">
      <Data>
        <Temperature/>
        <LowTemperature/>
        <HighTemperature/>
        <AverageTemperature/>
      </Data>
     </xforms:instance>

     <xforms:bind nodeset="AverageTemperature" type="xs:decimal"
      calculate="avg(../Temperature)"/>
     <xforms:bind nodeset="LowTemperature" type="xs:decimal"
      calculate="min(../Temperature)"/>
     <xforms:bind nodeset="HighTemperature" type="xs:decimal"
      calculate="max(../Temperature)"/>
  </xforms:model>

Hàm count-non-empty()

Hàm count() dựng sẵn trong XPath trả về số lượng các nút trong một tập-nút. Hàm mở rộng XForms count-non-empty() trả về số lượng các nút không rỗng trong một tập, ở đây "empty" (rỗng) được định nghĩa khi có một biểu diễn chuỗi không rỗng.

Ví dụ, để tính toán mức giá trung bình của một số mặt hàng, đầu tiên lấy tổng tất cả các giá riêng biệt bằng biểu thức như sum(../Price). Sau đó chia tổng cho count-non-empty(../Price).

      <xforms:output value="sum(../Price) div count-non-empty(../Price)">
        <xforms:label>Average price: </xforms:label>
      </xforms:output>

Ngược lại, nếu bạn chia cho count(../Price), thì giá trung bình có thể là quá thấp nếu có các trường bổ sung trong dạng mẫu đã không được người sử dụng điền vào đầy đủ.


Các hàm Boolean

XForms thêm hai hàm Boolean vào XPath 1.0:

  • if()
  • boolean-from-string()

Hàm if()

XSLT không cần hàm if() vì nó đã có xsl:if. Tuy nhiên, XForms không có toán tử lựa chọn, nên nó cần để thêm hàm if() vào XPath. Hàm if() có ba đối số:

  • Điều kiện thử nghiệm
  • Kết quả đúng
  • Kết quả sai

Đó là,

if (condition, trueresult, falseresult)

Hàm if() giống như toán tử ?: bậc ba trong các ngôn ngữ lập trình Java™ và C.

Ví dụ, Liệt kê 4 cho thấy một phiên bản sửa đổi của mô hình số ngày cho đến Lễ Giáng sinh có tính đến khả năng mà dạng mẫu có thể chạy dựa vào Ngày quà tặng (Boxing Day-ngày sau Lễ Giáng sinh). Để làm điều này, nó tính toán cả hai kết quả có khả năng, sau đó sử dụng hàm if() để chọn giữa chúng tùy thuộc vào việc kết quả đầu tiên có âm hay không.

Liệt kê 4. Một Xform đếm số ngày còn lại cho đến Lễ Giáng sinh này hoặc Lễ Giáng sinh sau
    <xforms:model>
     <xforms:instance xmlns="">
      <variables>
        <Now/>
        <Year/>
        <Christmas/>
        <ChristmasDay/>
        <NextChristmas/>
        <NextChristmasDay/>
        <Result/>
        <Result1/>
        <Result2/>
      </variables>
     </xforms:instance>

    <xforms:bind nodeset="Now" calculate="days-from-date(now())"/>
    <xforms:bind nodeset="Year" calculate="substring(now(), 1, 4)"/>
    <xforms:bind nodeset="Christmas" calculate="concat(../Year, '-12-25')"/>
    <xforms:bind nodeset="NextChristmas" calculate="concat(../Year + 1, '-12-25')"/>
    <xforms:bind nodeset="ChristmasDay" calculate="days-from-date(../Christmas)"/>
    <xforms:bind nodeset="NextChristmasDay" 
                    calculate="days-from-date(../NextChristmas)"/>
    <xforms:bind nodeset="Result1" calculate="../ChristmasDay - ../Now"/>
    <xforms:bind nodeset="Result2" calculate="../NextChristmasDay - ../Now"/>
    <xforms:bind nodeset="Result" 
      calculate="if(../ChristmasDay - ../Now &gt;= 0, 
                 ../Result1,
                 ../Result2) "/>

    </xforms:model>

Hàm boolean-from-string()

Hàm boolean-from-string() là hơi thừa với hàm boolean() có sẵn của XPath, nhưng chỉ thừa một nửa thôi. Hàm boolean-from-string() làm theo định nghĩa lược đồ W3C về Boolean. Còn hàm boolean() làm theo định nghĩa XPath của Boolean.

Trong lược đồ W3C, các chuỗi "true""1" là đúng. Các chuỗi "false""0" là sai. Tất cả các chuỗi khác là sai.

Ngược lại, trong XPath, tất cả các chuỗi không rỗng là đúng, có cả "false""0". Hơn nữa, hàm boolean() có những quy định cụ thể để xác định giá trị đúng của các số và các tập-nút. Hàm boolean-from-string() chỉ chuyển đổi các đối số của các kiểu khác thành các chuỗi và sau đó kiểm tra sự đúng đắn của chúng


Các hàm XForms

XForms định nghĩa ba hàm hoàn toàn để dùng riêng cho nó mà không có nghĩa ở nơi khác:

  • instance()
  • property()
  • index()

Hàm instance()

Khi một mô hình XForms có nhiều cá thể, hàm instance() lựa chọn một cá thể để làm việc với nó. Ví dụ, giả sử tính số ngày cho đến Lễ Giáng sinh chỉ là một phần của giao diện người dùng của trang này, nhưng bạn thực sự không muốn gửi lại nó cho máy chủ. Có dữ liệu khác mà bạn muốn gửi lại cho máy chủ, như trong Liệt kê 5. Ở đây dữ liệu thực ở trong cá thể có ID là orderInfo và các biến tạm thời ở trong cá thể có ID là temporaryVariables.

Liệt kê 5. Một xform có chứa hai cá thể
 <xforms:model>
     <xforms:instance xmlns="" id="temporaryVariables">
      <variables>
        <Now/>
        <Year/>
        <Christmas/>
        <ChristmasDay/>
        <NextChristmas/>
        <NextChristmasDay/>
        <Result/>
        <Result1/>
        <Result2/>
      </variables>
     </xforms:instance>

     <xforms:instance xmlns="" id="orderInfo">
      <Order>
        <Item/>
        <Price/>
      </Order>
     </xforms:instance>

    <xforms:bind nodeset="Now" calculate="days-from-date(now())"/>
    <xforms:bind nodeset="Year" calculate="substring(now(), 1, 4)"/>
    <xforms:bind nodeset="Christmas" 
               calculate="concat(instance('temporaryVariables')/Year, '-12-25')"/>
    <xforms:bind nodeset="NextChristmas" 
               calculate="concat(instance('temporaryVariables')/Year + 1, '-12-25')"/>
    <xforms:bind nodeset="ChristmasDay" calculate="days-from-date(../Christmas)"/>
    <xforms:bind nodeset="NextChristmasDay" 
               calculate="days-from-date(instance('temporaryVariables')/NextChristmas)"/>
    <xforms:bind nodeset="Result1" 
               calculate="instance('temporaryVariables')/ChristmasDay - ../Now"/>
    <xforms:bind nodeset="Result2"
               calculate="instance('temporaryVariables')/NextChristmasDay 
                        - instance('temporaryVariables')/Now"/>
    <xforms:bind nodeset="Result" 
      calculate="if(instance('temporaryVariables')/ChristmasDay 
                  - instance('temporaryVariables')/Now &gt;= 0, 
                 instance('temporaryVariables')/Result1,
                 instance('temporaryVariables')/Result2) "/>

    </xforms:model>

Thay vì giả sử một nút gốc cụ thể, thì bây giờ các phần tử bind chỉ định một cá thể mà chúng muốn bằng cách sử dụng instance('temporaryVariables'). Các phần tử bind khác có thể liên kết với cá thể thứ hai bằng instance('orderInfo'). Thật vậy, bạn thậm chí có thể kết hợp dữ liệu từ hai hay nhiều cá thể trong một biểu thức XPath.

Hàm property()

Hàm property() trả về giá trị của một đặc tính XForms. XForms chỉ định nghĩa hai đặc tính:

version (phiên bản)
Phiên bản của XForms được hỗ trợ: 1.0 cho XForms 1.0, 1.1 cho XForms 1.1, và v.v..
conformance-level (mức-phù hợp)
Lược tả của XForms đang sử dụng, thường là "full" cho một việc thực hiện đầy đủ.

Các trình xử lý XForms cụ thể có thể định nghĩa các đặc tính bổ sung ngoài hai đặc tính chuẩn này. Thông thường đây là các vùng tên đủ điều kiện.

Hàm index()

Hàm index() trả về vị trí hiện tại của một phần tử repeat. Điều đó có nghĩa là bạn chuyển chỉ mục lặp làm đối số, và hàm này trả về mục hiện tại trong quá trình lặp lại đó. Hàm này rất có ích để hoạt động trên mục mà người dùng hiện đang làm việc với nó.


Các hàm mở rộng

Trò vui không dừng lại ở đó. Các nhà cung cấp cá nhân được phép (và thậm chí được khuyến khích) mở rộng thư viện hàm cơ bản với các hàm bổ sung của riêng mình. Ví dụ, MozzIE 1.8 thêm các hàm toán học EXSLT và các hàm mở rộng ngày tháng và thời gian. Các hàm toán học gồm có abs(), acos(), asin(), atan(), atan2(), constant(), cos(), exp(), highest(), log(), lowest(), sin(), sqrt()tan(). Các hàm ngày tháng và thời gian gồm có add(), add-duration(), date(), date-time(), day-abbreviation(), day-in-month(), day-in-week(), day-in-year(), day-name(), day-of-week-in-month(), difference(), duration(), format-date(), hour-in-day(), leap-year(), minute-in-hour(), month-abbreviation(), month-in-year(), month-name(), parse-date(), second-in-minute(), sum(), time(), week-in-month(), week-in-year(), year()date-for().

Tuy nhiên, bạn cần hiểu rõ rằng một Xform, sử dụng bất kỳ hàm nào trong số các hàm này, sẽ chỉ làm việc trong MozzIE. Nó sẽ không làm việc trong ormsPlayer, Orbeon Forms, Chiba, hoặc Firefox (chí ít là không cho đến khi chúng cũng thực hiện các hàm EXSLT này). Do đó, bạn có thể cần bám vào tập tiêu chuẩn XForms 1.0 để triển khai rộng rãi. Tuy nhiên, chúng có thể có ích trong môi trường Intranet ở đó bạn biết tất cả mọi người đều có cùng trình xử lý dạng mẫu.

Xform, có chứa các hàm mở rộng XPath không-chuẩn, cần khai báo chúng trong một thuộc tính functions trên phần tử model. Liệt kê 6 cho thấy cách khai báo một số hàm mở rộng EXSLT cho lượng giác và số ngày.

Liệt kê 6. Một Xform khai báo các hàm mở rộng
 <xforms:model
    xmlns:date="http://exslt.org/dates-and-times"
    xmlns:math="http://www.exslt.org/math"
    functions="math:cos math:sin date:add date:year">
     <xforms:instance xmlns="" id="temporaryVariables">
 ...
     </xforms:instance>
...

 </xforms:model>

Khi thuộc tính functions có mặt trên phần tử model, trình xử lý XForms đọc nó trước khi tải dạng mẫu. Nếu nó thấy một hàm mở rộng mà nó không ghi nhận, nó tạm dừng xử lý bằng cách báo hiệu một sự kiện ngoại lệ-điện toán-xforms (xforms-compute-exception).


Kết luận

Chữ X trong XPath là viết tắt của mở rộng. XForms đã mở rộng XPath để cung cấp khả năng bổ sung và các tính năng độc đáo có giá trị học tập. Trong khi XForms hỗ trợ toàn bộ XPath 1.0 mà bạn đã sử dụng từ XSLT, thì đúng là XForms có hơn một chút. Một số các hàm như days-from-date()now() rất hay cần có. Những hàm khác như if()instance() là các thành phần quan trọng của bất kỳ Xform quan trọng nào. XForms sử dụng các hàm này còn hơn là không. Hãy tìm hiểu để lợi dụng các hàm mở rộng XPath của XForms và bạn cũng có thể là một người giỏi XForms.

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

  • Phần mềm dùng thử của IBM: Xây dựng dự án phát triển tiếp theo của bạn với phần mềm dùng thử có sẵn để tải về trực tiếp từ developerWorks.

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Nguồn mở
ArticleID=777364
ArticleTitle=Các mở rộng XForms với XPath
publish-date=11302011